1、创建内容提供者的时候用到ContentProvider
使用内容提供者的时候用到ContentResolver
2、UriMatcher——用于判断一条uri跟指定的多条uri中的哪条匹配【需要添加匹配规则】
匹配规则中路径后面还可以携带以下符号【通常作为查询的where条件使用】:
* 代表任何的文本
# 代表任何数字
3、为什么使用ContentProvider而不直接把数据库改成公开的?
因为使用ContentProvider可以自己定义访问规则,选择私有数据哪些共享,哪些不共享,加强数据的安全性,ContentProvider不仅仅只共享数据库,文本等也可以共享,但是我们用的最多的还是共享数据库
4、获取系统短信
查询sms表:address - date - type - body
路径和表名可以不同,路径不同不代表查的表就不同,路径不同代表的是不同的查询条件
inbox --> 查到的是收件箱的消息
5、插入短信
<1> type 1 —— 代表写,2 —— 代表读
<2> 插入时
读写权限都需要,因为我们不知道 内容提供者中的 insert 的具体实现
6、getType —— 返回通过指定uri获取的数据的mimetype,mimetype 公司自己定义,自己使用
vnd.android.cursor.dir/ --> 表示返回多条数据
vnd.android.cursor.item/ --> 表示返回单条数据
7、获取系统联系人
(1) 要查询的表及字段
raw_contacts表
contact_id:联系人id
data表:保存联系人的详细信息,一条信息是一行
data1:联系人信息的具体内容
raw_contact_id:联系人id,标识该行信息属于哪个联系人
mimetype_id:标识该行信息属于什么类型
mimetypes表:mimetype_id对应的mime类型
(2) 查询data表示是复合查询,查询的不只是data表,直接查询
mimetypes表中的mimetype,而不查询mimetype_id,因为mimetype_id就是指向mimetypes表中的mimetype,因此data中只查询data1和mimetype字段就可以了
(3) 实现步骤:
<1> 先拿到raw_contacts表中的contact_id
<2> 拿着联系人id去data表查询属于该联系人的信息
(4) 封装数据
将数据封装为一个java类,类中设置get/set方法
(5) 手机联系人就算删除,在手机中也不会完全删除,只是联系人id为null,所以无法在手机上的联系人列表中显示