Content Provider(内容提供者)为应用程序获取和存储数据提供了一个统一的接口,并且可以在不同的应用程序中共享数据。Content Provider对数据进行了封装并使用数据表的形式来组织数据。需要在Manifest文件中注册
Uri
Uri(统一资源标识符)指定了要操作的Content Provider,类似于Url,结构也与Url相似,分为以下几个部分
-
scheme Android中规定为
content://
- authority 即内容提供者的名称,用来唯一标识内容提供者content provider
-
path 内容提供者的路径
path
Uri不一定要指向一个数据库中的表,也可以指向一个xml,只不过会把任何数据都当作表处理而已
Android中提供了一些默认的Content Provider,例如
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI
自定义Content Provider
通过继承ContentProvider类来自定义自己的ContentProvider,继承的类要实现几个抽象方法
- onCreate() 创建ContentProvider后提供的回调方法,一般在此创建数据对象实例。该回调方法必须返回ture
- getType() 获取Uri对应的MIME类型
- query() 根据传入的Uri查询数据,返回一个Cursor对象
- insert() 根据传入的Uri插入数据,返回被改变的数据对应的Uri
- update() 根据传入的Uri更新数据,返回被更新的条数
- delete() 根据传入的Uri删除数据,返回被删除的条数
ContentProvider 中所操作的对象包括但不限于数据库对象,也可以是文件、XML等
UriMatcher
静态对象,对应了不同Uri的匹配规则。当匹配不成功时,返回UriMatcher.NO_MATCH
UriMatcher对象通过addURI增加规则,方法的参数对应传入的Uri的正则表示。例如使用字符#表示匹配任意数字
ContentUri
用于获取Uri的path部分,有两个常用方法
- withAppendedId() 为某个Uri加上id,再返回这个加上id的新Uri
- parseId() 获取Uri的path部分的id
Content Resolver
Content Resolver(内容解析者)通过传入Uri提供了对Content Provider接口的操作
如果Content Resolver注册了Content Observer(内容观察者),其对应的 Content Provider在更改数据时需要使用notifyChange()方法通知Observer数据源发生了改变
如果有不同进程的Content Resolver同时操作同一个Content Provider,为避免数据更新不同步,要将Manifest中Provider的android:multiprocess属性设为true
Content Provider被跨进程调用时是采用Binder机制传递数据的,因此数据交互是同步的
参考资料
Content Provider的学习实例总结
Android ContentProvider的介绍(很详细)
Android内容提供者(Content provider)
Android应用程序组件Content Provider应用实例
ContentProvider数据库共享之——MIME类型与getType()
多个Content Resolver操作Content Provider时的同步问题