1.适用场景
1) ContentProvider为存储和读取数据提供了统一的接口
2) 使用ContentProvider,应用程序可以实现数据共享
3) android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
// ContentProvider的主要方法 根据Uri的匹配(UriMatcher)来确定同一方法中操作的不同表
// 其实ContentProvider的增、删、改、查方法最后的具体操作也是通过SQLiteOpenHelper来获取SQLiteDatabase实现的 // 不过ContentProvider通过暴露Uri来实现不同应用程序间的数据共享 public abstract Uri insert(Uri uri, ContentValues values) public abstract int delete(Uri uri, String selection, String[] selectionArgs) public abstract int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) public abstract Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) // android提供的另一种跨进程的方法,根据method传进来的值去执行不同的操作, public Bundle call(String method, String arg, Bundle extras) // provider有个一个获取权限管理的方法,因为某些数据库的操作需要该进程具有某项权限 public AppOpsManager getAppOpsManager()public final String getCallingPackage() // 其他方法只能自己去源码看了 //这几个方法的调用时通过ContentResolver调用的 //android通过方法参数的Uri去确定具体调用那个provider public final Uri insert(Uri url, ContentValues values) public final int delete(Uri url, String where, String[] selectionArgs) public final int update(Uri uri, ContentValues values, String where, String[] selectionArgs) public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) public final Bundle call(Uri uri, String method, String arg, Bundle extras) // ContentProvider在AndroidManifest.xml的配置: <provider android:name=".DownloadStorageProvider" android:authorities="com.android.providers.downloads.documents" // Uri的authorities,android区分不同uri对应的provider的根据 android:grantUriPermissions="true" // 解释 android:exported="true" //是否能被其他进程调用 android:permission="android.permission.MANAGE_DOCUMENTS"> // 权限 <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>