内容提供者
1.内容提供者概述
内容提供者(ContentProvider)是Android系统四大组件之一,它是不同应用程序之间进行数据共享的标准API,通过ContentResolver类可以访问ContentProvider中共享的数据。
1.1数据模型
ContentProvider使用基于数据库模型的简单表格来提供需要共享的数据,在该表格中,每一行表示一条记录,而每一列代表特定类型和含义的数据,并且其中每一条数据记录都包含一个名为“_ID”的字段类标识每条数据。
_ID | NAME | NUMBER | |
---|---|---|---|
1 | 张三 | 13288888888 | 8888@qq.com |
2 | 李四 | 13266666666 | 6666@qq.com |
_ID:唯一标识,可以根据同一个ID查询几个相关表中的信息
知道各个字段对应的数据类型后,可根据Cursor对象提供的相关的方法,如:getInt()、getString()、getLong()等查询字段对应的值。
1.2Uri
ContentResolver提供一系列增删改查的方法对数据进行操作,并且这些方法以Uri的形式对外提供数据。Uri为内容提供者中的数据建立了唯一标识符。主要由三部分组成,scheme、authorities、path。
content://com.wanxi.mycontentprovider/person
scheme:"content://"是一个标准前缀
path:“/person”代表资源(或数据),可以动态改变
authority:是在创建内容提供者时指定的authorities属性值,通常采用程序包名的方式命名
2.创建内容提供者
2.1创建步骤
1、选中程序包名右击【New】-》【Other】-》【Content Provider】选项
2、输入内容提供者的ClassName(类名称)和URI Authorities(唯一标识,通常使用包名)
3、点击Finish完成创建
2.2完成
内容提供者创建完成后,Android Studio会自动在AndroidManifest.xml中对内容提供者进行注册。
<a
pplication …>
…
</application>
3.访问其他应用程序
3.1通过ContentProvider查询其他程序数据步骤
1、通过parse()方法解析Uri
Uri uri = Uri.parse("content://cn.wanxi.mycontentprovider/person");
2、通过query()方法查询数据
//获取ContentResolver对象
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder);
3、通过while()循环语句遍历查询到的数据
//条件为true时,继续遍历
while (cursor.moveToNext()) {
String address = cursor.getString(0);
long date = cursor.getLong(1);
int type = cursor.getInt(2);
}
cursor.close(); //关闭cursor
3.2UriMatcher类
如果一个ContentProvider中含有多个数据源(比如多个表)时,就需要对不同的Uri进行区分,此时可以用UriMatcher类对Uri进行匹配,匹配步骤如下:
1、初始化UriMatcher类
UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH)
2、注册需要的Uri
matcher.addURI(“cn.wanxi.contentprovider”, “people”, PEOPLE);
matcher.addURI(“cn.wanxi.contentprovider”, “person/#”, PEOPLE_ID);
3、与已经注册的Uri进行匹配
Uri uri = Uri.parse(“content://” + “cn.wanxi.contentprovider” + “/people”);
int match = matcher.match(uri);
switch (match){
case PEOPLE:
//匹配成功后做的相关操作
case PEOPLE_ID:
//匹配成功后做的相关操作
default:
return null;
}
4.内容观察者
内容观察者(ContentObserver)用于观察指定Uri所代表的数据的变化,当ContentObserver观察到指定Uri代表的数据发生变化时,就会触发onChange()方法,此时在onChange()方法中使用ContentResovler可以查询到变化的数据。要使用ContentObserver观察数据变化,就必须在ContentProvider中调用ContentResolver的notifyChange()方法。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ml3U4dRq-1671366901310)(C:\Users\HP\Desktop\观察者原理.png)]
4.1创建流程
1、创建内容观察者
private class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
}
//当观察到Uri代表的数据发生变化时调用此方法,并在该方法中处理相关逻辑
public void onChange(boolean selfChange) {
super.onChange(selfChange);
}
}
2、注册内容观察者
Con
tentResolver resolver = getContentResolver();
Uri uri = Uri.parse(“content://aaa.bbb.ccc”); resolver.registerContentObserver(uri, true, new MyObserver(new Handler()));
功能:为指定的Uri注册一个ContentObserver派生类实例,当指定的Uri发生改变时,回调该实例对象去处理。 参数1:uri 需要观察的Uri
参数2:notifyForDescendents false表示只匹配该Uri true表示可以同时匹配其派生的Uri 参数3:observer 创建的内容观察者对象
3、取消内容观察者
@Override
protected void onDestroy() {
super.onDestroy();
getContentResolver().unregisterContentObserver(new MyObserver(
new Handler()));
}
注意:在内容观察者监听的ContentProvider中,重写的insert()、delete()、update()方法中会调用ContentResolver的notifyChange()方法。