一、ContentProvider的概念
ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1、ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
query():查询
insert():插入
update():更新
delete():删除
getType():得到数据类型
onCreate():创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。
Android所提供的ContentProvider都存放在android.provider包当中。
二、实现ContentProvider的过程
一般情况下,我们是需要调用Android系统提供的ContentProvider就可以了。但是实现一个ContentProvider可以更加清楚地的原理。
自定义一个ContentProvider的步骤:
1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)
2、定义一个类,继承ContentProvider
3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
4、在AndroidManifest中进行声明
先介绍一下ContentProvider用到的UriMatcher。UriMatcher的一个重要的函数是match(Uri uri)。这个函数可以匹配Uri,根据传入的不同Uri返回不同的自定义整形值,以表明Uri访问的不同资源的类型。
例如:
public static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(Book.AUTHORITY, "item", Book.ITEM);
uriMatcher.addURI(Book.AUTHORITY, "item/#", Book.ITEM_ID);
}
这里UriMatcher类型的静态字段是用来匹配传入到ContentProvider中的Uri的类。其构造方法传入的匹配码是使用match()方法匹配根路径时返回的值,这个匹配码可以为一个大于零的数表示匹配根路径或传入-1,即常量UriMatcher.NO_MATCH表示不匹配根路径。addURI()方法是用来增加其他URI匹配路径的,第一个参数传入标识ContentProvider的AUTHORITY字符串。第二个参数传入需要匹配的路径,这里的#号为通配符,代表匹配任意数字,另外还可以用*来匹配任意文本。第三个参数必须传入一个大于零的匹配码,用于match()方法对相匹配的URI返回相对应的匹配码。 例如:sMatcher.addURI(“com.test.provider.personprovider”, “person”, 1);如果match()方法匹配content://com.test.provider.personprovider/person路径,返回匹配码为1。
示例:以下代码源自www.mars-droid.com视频教程中的代码。示例中自定义的ContentProvider的数据来源为SQLite。
main.xml
CPActivity.java
FirstProviderMetaData.java
FirstContentProvider.java
DatabaseHelper.java
strings.xml
AndroidManifest.xml
运行结果:
界面:
依次点击插入数据和查询数据按钮,控制台输出如下内容: