一、创建一个类,继承ContentProvider,重写onCreate,query,insert,update,delete,getType方法
二、在清单文件中声明provider节点
<provider
android:authorities="cn.test.provider" android:name="cn.test.contactproviderdemo.MyProvider"
android:exported="true">
provider>
这里需要注意的是:
android:authorities这个字符串相当于是一个拦截器,需要对应的URI匹配上才能访问对应的数据。
另外,在安卓4.4以上的版本中,还需要配置android:exported=”true”
三、通过UriMatcher添加对应的URI匹配规则
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 这里设置的数字,不为-1,但是最好为正数
private static final int QUERY_SUCCESS = 1;
private static final int INSERT_MATCHED = 2;
private static final int UPDATE_MATCHED = 3;
private static final int DELETE_MATCHED = 4;
static {
// 给当前的URI匹配器添加一条匹配规则
sURIMatcher.addURI("cn.test.provider", "query", QUERY_SUCCESS);
sURIMatcher.addURI("cn.test.provider", "insert", INSERT_MATCHED);
sURIMatcher.addURI("cn.test.provider", "update", UPDATE_MATCHED);
sURIMatcher.addURI("cn.test.provider", "delete", DELETE_MATCHED);
}
具体对数据库的增删改查,在这里就不贴代码出来了,接下来,就是其他应用访问这个应用的数据库了。
四、在一个新的工程下面,使用内容解析者获取数据
示例代码:
public void query(View v) {
// 获取内容解析者
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/query");
Cursor cursor = resolver.query(uri, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
System.out.println("name=" + name);
}
}
public void insert(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/insert");
ContentValues values = new ContentValues();
values.put("name", "二狗子");
values.put("phone", "489756848");
values.put("age", 12);
Uri insert = resolver.insert(uri, values);
System.out.println(insert);
}
public void delete(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/delete");
String where = "name = ?";
String [] selectionArgs = {"大牛"};
int delete = resolver.delete(uri, where, selectionArgs);
Toast.makeText(getApplicationContext(), "删除了" + delete + "条数据", Toast.LENGTH_SHORT).show();
}
public void update(View v) {
ContentResolver resolver = getContentResolver();
Uri uri = Uri.parse("content://cn.test.provider/update");
ContentValues values = new ContentValues();
values.put("name", "小二黑");
String where = "name = ?";
String [] selectionArgs = {"二狗"};
int update = resolver.update(uri, values, where, selectionArgs);
Toast.makeText(getApplicationContext(), "更新了" + update + "条数据", Toast.LENGTH_SHORT).show();
}
这里又一点需要说明的是,Uri资源的访问,必须加上content://,另外,cn.test.provider对应的是另一个工程再清单文件中android:authorities字段中声明的字符串,后面跟着的字符比如,query,insert,delete等等,是在另一个工程中,在static静态代码块中由UriMatcher对象add进来的匹配规则,如果对应上就会执行相应的方法。