Android Note - Content Provider

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

Android Note - Content Provider_第1张图片
内容提供者

自定义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时的同步问题


你可能感兴趣的:(Android Note - Content Provider)