ContentProvider
1.内容URI标准的格式写法(权限+路径):
content://com.example.app.provider/table1 content://com.example.app.provider/table2
当然也可以具体到表中id:
content://com.example.app.provider/table1/1
2.创建自己的ContentProvider(实现跨进程共享数据)
(1)创建自己的Provider类,实现CRUD
注:public class MyProvider extends ContentProvider { @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public String getType(Uri uri) { return null; } }
onCreate():完成对数据库的创建和升级等操作,只有当存在ContentResolver尝试访问我们程序中的数据时,
内容提供器才会被初始化。
getType():据传入的内容URI来返回相应的MIME类型。
2.给自己的Provider创建匹配方式:
public class MyProvider extends ContentProvider { public static final int TABLE1_DIR = 0; public static final int TABLE1_ITEM = 1; public static final int TABLE2_DIR = 2; public static final int TABLE2_ITEM = 3; private static UriMatcher uriMatcher; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR); uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM); uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM); uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM); } …… @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { switch (uriMatcher.match(uri)) { case TABLE1_DIR: // 查询table1表中的所有数据 break; case TABLE1_ITEM: // 查询table1表中的单条数据 break; case TABLE2_DIR: // 查询table2表中的所有数据 break; case TABLE2_ITEM: // 查询table2表中的单条数据 break; default: break; } …… } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case TABLE1_DIR: return "vnd.android.cursor.dir/vnd.com.example.app.provider. table1"; case TABLE1_ITEM: return "vnd.android.cursor.item/vnd.com.example.app.provider. table1"; case TABLE2_DIR: return "vnd.android.cursor.dir/vnd.com.example.app.provider. table2"; case TABLE2_ITEM: return "vnd.android.cursor.item/vnd.com.example.app.provider. table2"; default: break; } return null; } …… }
注:
(1)在静态代码块里我们创建了UriMatcher的实例,并调用addURI()方法,将期望匹配的内容URI格式传递进去,注意这里传入的路径参数是可以使用通配符的。 (2)getType()方法。它是所有的内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型。一个内容URI所对应的MIME字符串主要由三部分组分,Android对这三个部分做了如下格式规定。
所以,对于content://com.example.app.provider/table1这个内容URI,它所对应的MIME类型就可以写成:1. 必须以vnd开头。
2. 如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/。
3. 最后接上vnd.<authority>.<path>。
vnd.android.cursor.dir/vnd.com.example.app.provider.table1对于content://com.example.app.provider/table1/1这个内容URI,它所对应的MIME类型就可以写成:
vnd.android.cursor.item/vnd. com.example.app.provider.table1
3.在AndroidManifest.xml中注册:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.databasetest" android:versionCode="1" android:versionName="1.0" > …… <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > …… <provider android:name="com.example.databasetest.DatabaseProvider" android:authorities="com.example.databasetest.provider" > </provider> </application> </manifest>