实现持久化的技术中我们前面已经讲解了4中 今天小遍再跟大家回顾一下远程存储 ContentProvider ——内容提供者
关于存储的分类 我们大体可以总结为:
本地存储
共享参数
File存储
数据库存储
远程存储
ContentProvider
一, 什么是ContentProvider?
多个应用程序之间数据存储和检索的桥梁, 实现的是多个应用程序之间数据的共享 最重要的他是四大组件之一
是多个应用程序之间数据共享的唯一方式
注意:
如果想要访问ContentProvider暴露的数据, 那么需要通过ContentResolver接口获取数据
如果想要暴露自己应用程序的数据, 则需要自定义一个ContentProvider, 然后将数据暴露出去
二, 作用
将应用程序的私有数据向外提供一个访问的接口, 基于URI的方式
三, URI 统一资源标识符 (在应用程序中是唯一)
格式: content://应用程序的包名.provider/表名(一般是自定义)
四, 分析
ContentResolver 内容解析器 负责解析ContentProvider暴率出来的数据 "客户端"
ContentProvider 内容提供者 负责向外暴露数据 "服务器"
五, 实例
实例一, 访问短信记录
uri = "content://sms"
1, 得到内容解析器对象:
ContentResolver resolver = getContentResolver()
2, 通过URI格式, 解析数据
Cursor cursor = resolver.query(Uri,字段,条件, 条件值, 排序);
3, 在清单文件中添加读取短信的权限
android.permission.READ_SMS
实例二, 访问联系人列表
uri = "content://com.android.contacts/contacts"
1, 得到内容解析器对象
2, 通过Uri格式,解析数据
3, 在清单文件中添加读取联系人的权限
raw_contacts(联系人表 有多少个联系人, 就有多少条记录)
_id 主键
display_name 联系人名称
data (实际内容) 同一个人会有多条记录, 姓名, 电话,邮箱.....
_id 主键
raw_contact_id (raw_contacts主键) 当前数据是那个用户的
mimetype_id (mimetypes 主键) 当前数据是什么类型( 姓名, 电话,邮箱....)
mimetypes (数据类型)
_id 主键
(1 邮箱, 5 电话 , 7 姓名)
六, 自定义ContentProvider
1, 定义一个类, 继承ContentProvider, 重写父类的6个方法
onCreate() 初始化工作
query(Uri uri,....) 查询数据
insert(Uri uri,....) 添加数据
update(Uri uri,....) 修改数据
delete(Uri uri,....) 删除数据
getType(Uri uri) 只实现, 不做处理
2, 声明ContentProvider的唯一标识, 必须是小写字母
3, 声明访问数据库中的那些表的code
4, 声明Uri的匹配器,实例化
private static UriMatcher uriMatcher;
static{
// code 匹配码 UriMatcher.NO_MATCH : 不匹配任何Uri
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//注册Uri
/**
* authority ContentProvider的唯一标识
* path 路径(建议为表名, 但是不一定)
* code 当前Uir的匹配码
*/
//t_user表中的数据 : content://com.qf.day16_contentprovider_01.qf/t_user ---编码:1
uriMatcher.addURI(AUTHORITY, "t_user", CODE_USER);
//t_older表中的数据: content://com.qf.day16_contentprovider_01.qf/t_order ---编码:6
uriMatcher.addURI(AUTHORITY, "t_order", CODE_ORDER);
}
5, 定义一个数据库的帮助类, 并在onCreate() 方法中初始化
6, 在相应的增删改查方法中通过Uri匹配器, 判断当前传入的Uri到底是操作那张表的code
if(uriMatcher.match(uri) == CODE_USER){.....}
7, 在清单文件中,注册ContentProvider
<!-- 注册ContentProvider
name: 说明要注册的是那个ContentProvider 全类名
authorities 唯一标识 必须与ContentProvider中的唯一标识完全一直(复制过去)
exported 声明当前的类 可以被外部的应用程序访问
-->
<provider
android:name="com.qf.day16_contentprovider_01.provider.MyContentProvider"
android:authorities="com.qf.day16_contentprovider_01.qf"
android:exported="true"
/>
ContentUris中的方法:
ContentUris.parseId(newUri) 从uri中解析ID
ContentUris.withAppendedId(uri, id); 在uir上 , 追加ID
小遍结语:我们生活中充满了一些 饮食、睡眠、游玩、恋爱,也就是说我们不得不接触一些生活中美好的事情,不过我们必须不屈服于这些事物。因为要把时间用在最对的地方》》》》》