【Android】プロセス通信IPC-ContentProvider


概要
コンテンツプロバイダは、データをカプセル化し、ContentResolverを介してアプリケーションに提供するアプリケーションにコンテンツを提供します.ContentProviderは、複数のアプリケーション間でデータを共有する必要がある場合にのみ必要です.Androidは、一般的なデータの一部にデフォルトのContentProviderを提供しています.
データプロバイダ
  • Provider ContentProviderはAndroidManifestにある必要があります.xmlで宣言します.
        
    

    説明
    authorities
    ported
    adPermission
    itePermission
    注意:ContentProviderのauthoritiesは一意でなければなりません.2つのAPPで同じauthoritiesを宣言することはできません.そうしないと、インストール時にINSTALL_をエラーで報告します.FAILED_CONFLICTING_PROVIDER
  • 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のプログラムにアクセスするとアプリケーションが起動します.
  • 権限声明必要に応じてAndroidManifest.xmlは必要な読み書き権限を追加します.
  • データ操作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)
    
  • を行う.