1.创建自己的内容提供器
新建MyProvider类继承ContentProvider:
New---Other---ContentProvider
public class MyProvider extends ContentProvider {
public MyProvider() {
}
@Override
public boolean onCreate() {
//初始化内容提供器的时候调用。
// 通常会在这里完成对数据库的创建和升级等操作
//返回true表示内容提供器初始化成功,false表示失败
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
//返回查询结果
return null;
}
@Nullable
@Override
public String getType(@NonNull Uri uri) {
//根据传入的内容URI来返回相应的MIME类型
return null;
}
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
//添加完成后,返回一个用于表示这条新记录的URI
return null;
}
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
//返回被删除的行数
return 0;
}
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
//返回更新的行数
return 0;
}
}
以query()方法为例。在query方法中,根据传入的内容URI,来匹配期望调用的表以及表中的数据。根据不同的数据,编写不同的方法。
内容URI主要分为两种:
以路径结尾表示期望访问表中的所有数据:content://com.futuring.app.sharedata/table
以id(主键)结尾表示访问该表中拥有相应id的数据:content://com.futuring.app.sharedata/table/1
可以使用通配符的方式来分别匹配这两种格式的内容URI:
一个能够匹配任意表的内容URI格式可以写成:content://com.futuring.app.sharedata/ *
一个能匹配table表中任意一行数据的内容URI格式可以写成:
content://com.futuring.app.sharedata/table/#
接着利用UriMatcher这个类来实现匹配内容URI的功能。UriMatcher中提供了一个addURI()方法,分别接收内容URI的authority和path,还有一个自定义代码。
当调用UriMatcher的match()方法时,传入一个Uri对象,返回值是可以与之匹配的自定义代码,利用这个自定义代码,就可以判断出调用哪张表中的数据。
getType()方法用于获取Uri对象所对应的MIME类型。一个内容URI所对应的MIME主要由3部分组成:
- 必须以vnd开头;
- 如果内容URI以路径结尾,则后接android.cursor.dir/;如果以id结尾,则后接android.cursor.item/。
- 最后接上vnd.<authority>.<path>。
所以对于content://com.futuring.app.sharedata/table这个内容URI对应的MIME类型:vnd.android.cursor.dir/vnd.com.futuring.app.sharedata.table
对于content://com.futuring.app.sharedata/table/1这个内容URI对应的MIME类型:vnd.android.cursor.item/vnd.com.futuring.app.sharedata.table
网友评论