7.4 创建自己的内容提供器
7.4.1 创建内容提供器的步骤
想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器。
ContentProvider类中有六个抽象方法,我们在使用子类继承它的时候,需要重写这六个方法。
//新建MyProvider继承自ContentProvider
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
//根据传入的内容Uri来返回响应的MIME类型(MIME类型下面介绍)
public String getType(Uri uri) {
return null;
}
}
注意:MIME类型
一个内容URI所对应的MIME字符串主要由3部分组成:
1)必须以vnd开头
2)如果内容URI以路径为结尾,则在vnd后接android.cursor.dir/
如果以id为结尾,则在vnd后接android.cursor.item/
3)最后接上vnd.<authority>.<path>例:对于content://com.example.app.provider/table1,它所对应的MIME类型为:
vnd.android.cursor.dir/vnd.com.example.app.provider.table1
例:对于content://com.example.app.provider/table1/1,它所对应的的MIME类型为:
vnd.android.cursor.item/vnd.com.example.app.provider.table1
注意:*表示匹配任意长度的任意字符,#表示匹配任意长度的数字
//继续修改MyProvider中的代码
//我们借助UriMatcher这个类就可以轻松的实现匹配内容URI的功能。UriMatcher中提供了一个addURI()方法
//它接收三个参数:authority,path,一个自定义的代码
//当调用UriMatcher的match方法时,就可以将一个Uri对象传入,返回值是某个能匹配这个Uri对象所对应的自定义代码
//利用这个返回的自定义代码可以判断出调用方期望访问的是哪一张表的中的数据了
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;
public 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_DIR);
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:
//查询table11表中的单条数据
break;
...
}
return null;
}
@Override
public String getType(Uri uri) {
switch(uriM