啥是Content provider

Content Provider 用于保存和获取数据并使其对所有应用程序可见。这是不同应用程序间共享数据的唯一方式。在Android中没有提供所有应用共同访问的公共存储区域。
Content Provider 内部如何保存数据由其设计者决定,但是所有的Content Provider 都实现一组通用的方法用来提供数据的增,删,查,改功能。
客户端通常不会直接调用这些方法,大多数是通过Content Resolver 对象实现对Content Provider 的操作,开发人员可以通过调用Activity或者其他应用程序组件的实现类中的getContentResolver来获取ContentResolver对象。

数据模型

Content Provider 使用基于数据库模型的简单表格来提供其中的数据,这里每一行代表一条记录,每列代表特定类型和含义的数据。每条记录包含一个数值型的_ID字段,它用于在表格中唯一标识该记录。

URI

每个Content Provider 提供公共的URI来唯一标识其数据集,管理多个数据集(多个表格)的Content Provider 为每个数据集提供了单独的URI,所有为provider提供的URI都以content://作为前缀,用于识别应该使用哪个provider及其中的哪个表格。
如果自定义一个Content Provider 则应该为其URI也定义一个常量。Android为当前平台提供的Content Provider 定义了一个CONTENT_URI常量,匹配电话号码到联系人表格的URI和匹配保存联系人照片的表格的URI分别如下:
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI

A:标准的前缀,用于表示该数据由Content Provider管理。
B:URI的授权部分,它标识该Content Provider。对于第三方应用,该部分应该是完整的类名(使用小写形式)来唯一确定。
C:Content Provider 的路径部分,用于决定哪类数据被请求,如果Content Provider 仅提供一种数据类型,这部分可以省略,如果provider提供几种类型,包括子类,这部分可以由几个部分组成。
D:被请求的特定记录的ID值,这是被请求数据记录的_ID,如果请求不限于单条记录该部分及前面的斜线应该删除.

系统定义的Content Provider

  • Browser:读取或者修改书签,浏览历史或者网络搜索
  • CallLog:查看或更新通话历史
  • Contacts:读取,修改或保存联系人信息
  • LiveFolders:由Content Provider 提供内容的特定文件夹
  • MediaStore:访问声音,视频和图片
  • Setting:查看和获取蓝牙设置,铃声等偏好设置
  • SearchRecentSuggestions:能被配置以使用查找意见的provider操作
  • SyncStateContract:用于使用数据数组账号关联数据的Content Provider约束。
  • UserDictonary:在可预测文本输入时,提供用户定义单词给输入法使用,应用程序和输入法能够增加数据到该字典,单词能关联频率信息和本地化信息。

自定义Content Provider

  1. 建立数据存储系统。大多数Content Provider 使用Android文件存储方法或者SQLite数据库保存数据,但是开发人员可以使用任何方式存储
  2. 继承ContentProvider类来提供数据访问
  3. 在应用程序的AndroidManifest文件中声明Content Provider
继承ContentProvider类

开发人员定义ContentProvider类的子类,以便使用ContentResolver和Cursor类带来的便捷来共享数据。要达到这个目的原则上要实现如下的几个方法

由于这些ContentProvider方法能够被位于不同进程和线程的不同Content Resolver对象调用,它们必须以线程安全的方式实现。
此外开发人员可能也想调用Content Resolver.notifyChange()方法以便在数据修改时候通知监听器

定义CONTENT_URI:

开发人员必须为该值定义一个唯一的字符串

public static final Uri  CONTENT_URI= Uri.parse("content://com.example.employee");
````
如果有子表可以使用如下定义:

public static final Uri CONTENT_URI= Uri.parse(“content://com.example.employee/dba”);

##### 定义内容提供者将返回给客户端的列名:
如果开发人员使用的是底层数据库,这些列明通常与SQL列明相同,确保包含名为_ID的整数列作为记录的ID值。
如果使用SQLite数据库,_ID字段应该是INTEGER PRIMARY KEY AUTOINCREMENT.
##### 注释每列的数据类型
如果开发人员正在处理新数据类型,则必须定义新的MIME类型,以便在ContentProvider.getType方法中返回.
##### 声明内容提供者



Contents
  1. 1. 啥是Content provider
  2. 2. 数据模型
  3. 3. URI
  4. 4. 系统定义的Content Provider
  5. 5. 自定义Content Provider
    1. 5.1. 继承ContentProvider类
    2. 5.2. 定义CONTENT_URI: