1. ContentProvider创建步骤
- 想实现跨程序共享数据,官方推荐使用ContentProvider,可以通过新建一个类去继承ContentProvider的方法来创建自己的ContentProvider。
1.1抽象代码实例
- 其中继承该类需要重写6个抽象方法,在使用子类继承时,需要全部重写,代码如下所示:
1.2 方法简介
仅对每个抽象类的功能进行介绍
1. onCreate()
- 初始化ContentProvider时被调用,在这里完成对数据库的创建和升级等操作,返回true表示初始化成功,返回false表示初始化失败。
只有当存在ContentResolver尝试访问我们程序中的数据时,内容提供起才会被初始化。
2. query()
- 从ContentProvider中查询数据。使用uri参数来确定查询哪张表。
1)projection参数用于查询哪些列;
2)selection和selectionArgs参数用于约束查询哪些行;
3)sortOrder参数用于对结果进行排序;
4)查询结果存放在Cursor对象中返回。
3. insert()
- 向ContentProvider中添加一条数据。使用uri参数来确定要添加的表,待添加的数据保存在values参数中。
1)values的类型需为ContentValues的对象;
2)添加结束后,返回一个用于表示这条新纪录的URI。
3)需要调用context.getContentResolver().notifyChange()方法
4. update()
- 更新ContentProvider中已有的数据
1)uri参数来确定更新哪一张表中的数据;
2)values参数保留新数据,ContentValues类型;
3)selection和selectionArgs参数用于约束更新哪些行,受影响的行数将作为返回值返回。
5. delete()
- 从ContentProvider中删除数据。
1)uri参数用来确定删除哪一张表中的数据;
2)selection和selectionArgs参数用于约束删除哪些行,被删除的行数作为返回值返回。
6. getType()
- 根据传入的内容URI来返回相应的MIME类型。
1.3 URI
- 上文的抽象方法中几乎每个方法中都带有Uri参数,这个参数也正是调用ContentResolver的增删改查方法时传递过来的。
- 使用URI参数时需要对传进来的Uri参数进行解析,从中分析出调用方期望访问的表和数据。
1.3.1 正常的URI
- 内容URI的格式主要就只有以下两种:
标准的URI写法,表示调用方期望访问的是com.example.app这个应用中的table1表中的数据
content://com.example.app.provider/table1
在URI后面加一个id,表示调用方期望访问的是com.example.app这个应用table1表中id为1的数据。
content://com.example.app.provider/table1/1
1.3.2 带通配符的URI
- 可以使用通配符的方式来分别匹配这两种格式的URI,规则如下:
- *:表示匹配任意长度的任意字符。
- #:表示匹配任意长度的数字。
一个能够匹配任意表的内容的URI格式为:
content://com.example.app.provider/*
一个能匹配table1表中任意一行数据的内容URI格式为:
content://com.example.app.provider/table1/#
1.4 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;
private static UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMathcer.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 () {
case TABLE1_DIR:
// 查询table1表中的所有数据
break;
case TABLE1_ITEM:
// 查询table1表中的单条数据
break;
case TABLE2_DIR:
// 查询table2表汇总的所有数据
break;
case TABLE2_ITEM;
// 查询table2表中的单条数据
break;
}
...
}
}
- 其中,MyProvider新增加了4个整形常量,其中TABLE1_DIR表示访问table1表中所有数据,TABLE1_ITEM表示访问table1表中的单条数据,TABLE2_DIR表示访问table2表中所有数据,TABLE2_ITEM表示访问table2表中的单条数据。
- 在静态代码块中创建了UriMatcher实例,并调用addURI()方法
网友评论