public class MyProvider extends ContentProvider {
@Override
public boolean onCreate() {//初始化内容提供器,完成对数据库的创建和升级等操作,返回true则初始化成功,返回false则初始化失败,只有当存在ContentReslover尝试访问我们程序的时候才会初始化
return false;
}
//在内容提供器中查询数据,使用uri参数来确定查询哪张表,projection参数用于确定查询那些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
return null;
}
//向内容中添加一条数据,使用uri参数来确定要添加到的表,待添加的数据灿存在values参数中。添加完成后,返回一个用于表述这条新记录的URI
@Nullable
@Override
public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
return null;
}
//更新内容提供器中已有数据,使用uri参数来确定更新哪张表中的数据。新数据保存在values参数中
@Override
public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
//从内容提供器中删除数据,使用uri来确定删除哪张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回
@Override
public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) {
return 0;
}
//根据传入的内容URI,来返回相应的MUME类型
@Nullable
@Override
public String getType(@NonNull Uri uri) {
return null;
}
}
onCreate()
初始化内容提供器,完成对数据库的创建和升级等操作,返回true则初始化成功,返回false则初始化失败,只有当存在ContentReslover尝试访问我们程序的时候才会初始化
query()
在内容提供器中查询数据,使用uri参数来确定查询哪张表,projection参数用于确定查询那些列,selection和selectionArgs参数用于约束查询哪些行,sortOrder参数用于对结果进行排序,查询的结果存放在Cursor对象中返回。
insert()
向内容中添加一条数据,使用uri参数来确定要添加到的表,待添加的数据存在values参数中。添加完成后,返回一个用于表述这条新记录的URI
update()
更新内容提供器中已有数据,使用uri参数来确定更新哪张表中的数据。新数据保存在values参数中
delete()
从内容提供器中删除数据,使用uri来确定删除哪张表中的数据,selection和selectionArgs参数用于约束删除哪些行,被删除的行数将作为返回值返回
getType()
根据传入的内容URI,来返回相应的MUME类型
一个比准的内容URI写法是这样的:
content://com.example.app.provider/table1
这就表示调用方期望访问的是com.example.app这个应用的table1表中的数据。除此之外,我们还可以在这个内容URI的后面加上一个id,如下所示:
content://com.example.app.provider/table1/1
这就表示调用方期望访问的是com.example.app这个应用的table1表中id为1的数据
内容URI的格式主要就只有以上两种,以路径结尾就表示期望访问该表中所有的数据,以id结尾就表示期望访问该表中拥有对应id的数据。我们可以使用通配符的方式来分别匹配这两种格式的URI
*:表示匹配任意长度的任意字符
#:表示能够匹配任意长度的数字
eg:content://com.example.app.provider/*
content://com.example.app.provider/table1/#
我们在借助UriMatcher这个类就可以轻松的实现匹配内容URI的功能。其中提供了addURI()的方法,可以把authority、path和一个自定义代码穿进去,这样,当调用UriMatcher的match()方法时,就可以讲一个Uri对象传入,返回值是某个能够匹配这个Uri对象所对应的自定义代码,利用这个代码,我们就可以判断出调用方期望访问的是哪张表中的数据了。
我们添加如下代码:
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.wangkangli.myprovider.provider","table1",TABLE1_DIR);
uriMatcher.addURI("com.wangkangli.myprovider.provider","table1/#",TABLE1_ITEM);
uriMatcher.addURI("com.wangkangli.myprovider.provider","table2",TABLE2_DIR);
uriMatcher.addURI("com.wangkangli.myprovider.provider","table2/#",TABLE2_ITEM);
}
@Override
public boolean onCreate() {
return false;
}
@Nullable
@Override
public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {
switch (uriMatcher.match(uri)){
case TABLE1_DIR:
//查询table1表中所有数据
break;
case TABLE1_ITEM:
break;;
case TABLE2_DIR:
break;
case TABLE2_ITEM:
break;
}
}
只是用query为例子做了个示范。
另外getType()方法,是所有内容提供器必须提供的一个方法,用于获取Uri对象所对应的MIME类型。一个内容URI所对应的MIME字符串主要有三部分组成
1、必须以vnd开头
2、如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容以id结尾,则后接android.cursor.item/
3、最后接上vnd.<authority>.<path>
所以可以写成
vnd.android.cursor.dir/vnd.com.example.app.provider.table1
vnd.android.cursor.item/vnd.com.example.app.provider.table1
public String getType(@NonNull 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;
}
于是就完成了。