1、新建一个类去继承 ContentProvider 的方式来创建一个自己的内容提供器
2、ContentProvider 类中有六个抽象方法,我们在使用子类继承它的时候,需要将这六个方法全部重写。
- onCreate()
- query()
- insert()
- update()
- delete()
- getType():根据传入的内容URI来返回相应MIME类型
3、借助UriMatcher这个类可轻松实现匹配内容URI的功能, UriMatcher提供 addURI()方法,把权限,路径和自定义代码传进去。
通配符:
content://com.example.app.provider/*
*表示匹配任意长度的任意字符
content://com.example.app.provider/table1/#
表示匹配任意长度的数字
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);
}
4、根据调入的URI返回table表中的数据
@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;
}
5、使用getType()方法,用于获取 Uri 对象所对应的 MIME 类型字符串。
- vnd开头
- 内容URI以路径结尾android.cursor.dir/,内容URI以id结尾,android.cursor.item/
- 接上 vnd..
content://com.example.app.provider/table1
对应
vnd.android.cursor.dir/vnd.com.example.app.provider.table1
@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;
}