内容提供者

内容提供者

1.内容提供者概述

内容提供者(ContentProvider)是Android系统四大组件之一,它是不同应用程序之间进行数据共享的标准API,通过ContentResolver类可以访问ContentProvider中共享的数据。

1.1数据模型

ContentProvider使用基于数据库模型的简单表格来提供需要共享的数据,在该表格中,每一行表示一条记录,而每一列代表特定类型和含义的数据,并且其中每一条数据记录都包含一个名为“_ID”的字段类标识每条数据。

_IDNAMENUMBEREMAIL
1张三132888888888888@qq.com
2李四132666666666666@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中对内容提供者进行注册。

<application …> </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、注册内容观察者

ContentResolver 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()方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值