【Android】进程通信IPC——ContentProvider

简介

内容提供者为应用程序提供内容,它封装数据并通过ContentResolver将其提供给应用程序。只有在多个应用间需要共享数据的时候才需要ContentProvider。Android已经为常见的一些数据提供了默认的ContentProvider。

数据提供者

  1. Provider
    ContentProvider需要在AndroidManifest.xml中声明。

        
    
    说明
    authorities
    ported
    adPermission
    itePermission

    注: ContentProvider的authorities必须是唯一的,两个APP不能声明相同的authorities,否则安装时会报错INSTALL_FAILED_CONFLICTING_PROVIDER

  2. ContentProvider
    继承ContentProvider,实现需要实现的方法(onCreate,getType,insert,delete,update,query)。

        @Override
        public boolean onCreate() {
            mContext = getContext();
            mUserDBHelper = new UserDBHelper(mContext);
            db = mUserDBHelper.getWritableDatabase();
    
            mUriMatcher.addURI(AUTHORITIES, PATH, CODE);
            return true;
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            if (isMatch(uri)) {
                return db.delete(UserDBHelper.TABLE_USER, selection, selectionArgs);
            }
            return 0;
        }
    
        @Override
        public String getType(Uri uri) {
            // at the given URI.
            return null;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            if (isMatch(uri)) {
                long id = db.insert(UserDBHelper.TABLE_USER, null, values);
                return ContentUris.withAppendedId(uri, id);
            }
            return null;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection,
                            String[] selectionArgs, String sortOrder) {
            if (isMatch(uri)) {
                return db.query(UserDBHelper.TABLE_USER, projection, selection, selectionArgs, null, null, sortOrder);
            }
            return null;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection,
                          String[] selectionArgs) {
            if (isMatch(uri)) {
                return db.update(UserDBHelper.TABLE_USER, values, selection, selectionArgs);
            }
            return 0;
        }
        
        /**
         * 是否是提供的数据访问
         * @param uri
         * @return
         */
        private boolean isMatch(Uri uri) {
            return CODE == mUriMatcher.match(uri);
        }
    

内容访问者

使用ContentResolver访问数据库,传入内容提供者的Uri。访问ContentProvider所在程序的时候会启动它的Application。

  1. 权限声明
    根据需要在AndroidManifest.xml加入需要的读写权限。
  2. 数据操作
    使用ContentResolver进行insert,delete,update,query操作
    getContentResolver().insert(uri, contentValues);
    
    getContentResolver().delete(mUri, "name like ?", new String[]{"visitor%"});
    
    getContentResolver().update(mUri, contentValues, "name like ?", new String[]{"visitor%"})
    
    getContentResolver().query(mUri, new String[]{"id", "name", "age", "address"}, null, null, null)
    

你可能感兴趣的:(Android,知识体系)