【Android】進程通信IPC——ContentProvider

簡介

內容提供者爲應用程序提供內容,它封裝數據並通過ContentResolver將其提供給應用程序。只有在多個應用間需要共享數據的時候才需要ContentProvider。Android已經爲常見的一些數據提供了默認的ContentProvider。

數據提供者

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

        <provider
            android:name=".module.ContentProvider.CustomContentProvider"
            android:authorities="com.sjl.provider"
            android:enabled="true"
            android:exported="true"
            android:readPermission="com.sjl.provider.read"
            android:writePermission="com.sjl.provider.write"></provider>
    
    說明
    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)
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章