1. 理解
1). 为会么要有ContentProvider?
a. 数据库文件只能当前应用访问, 别的应用不能直接访问
b. 在真实的应用需求中, 可能需要应用操作其它应用的数据库表数据
2). ContentProvider是什么?
ContentProvider是四大应用组件之一
当前应用使用ContentProvider将数据库表数据操作暴露给其它应用访问
其它应用需要使用ContentResolver来调用ContentProvider的方法
它们之间的调用是通过Uri来进行交流的
2. 相关API:
1). ContentProvider: 内容提供者类
a. CRUD的方法: query(), insert(), update(), delete()
b. onCreate()\
a. CRUD的方法:
query(),
insert(),
update(),
delete()
b. 实现观察的相关方法:
registContentObserver()
unRegistContentObserver()
notityChanged()
c.得到它的对象
context.getCOntentResolver();
3. ContentObserver: 内容观察者类
void onChange(boolean selfChange) : 数据改变, 且执行了notityChanged()
4). Uri: 包含一个具有一定格式的字符串所对应资源的类
A : 是一个前缀,表示是由ContentProvider提供,固定不变
B : authority, 标识是哪个Provider,不同的Provider此部分必须不同。
C : 对应于哪张表 student
D : id值, 对应表中的哪条记录
5). UriMatcher: 用来识别uri的一个uri容器
//添加一个合法的URI
void addURI(String authority, String path, int code)
//匹配指定的uri, 返回匹配码
int match(Uri uri)
6). ContentUris: 操作uri的工具类
//解析uri, 得到其中的id
long parseId(Uri contentUri)
//添加id到指定的uri中
Uri withAppendedId(Uri contentUri, long id)
3. 自定义ContentProvider
1).编写ContentProvider子类
class StudentContentProvider extends ContentProvider {
//实现inert、delete、update和query等方法
}
2). 在manifest.xml中注册
android:name=".StudentContentProvider"
android:authorities="com.atguigu.provider.studentprovider"
android:exported="true"/>//标识是否允许其它应用访问,默认是false
4. 使用ContentResolver访问ContentProvider
1). 得到ContentResolver的对象
2). 调用query(), delete(), update(), insert()方法调用ContentProvider对应的方法
操作ContentResolver: 注册, 解注册, 通知