简介
内容提供者为应用程序提供内容,它封装数据并通过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)