簡介
內容提供者爲應用程序提供內容,它封裝數據並通過ContentResolver將其提供給應用程序。只有在多個應用間需要共享數據的時候才需要ContentProvider。Android已經爲常見的一些數據提供了默認的ContentProvider。
數據提供者
-
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
-
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。
- 權限聲明
根據需要在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)