Android 初步之Android组件 Content Provider
啥是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
- 建立数据存储系统。大多数Content Provider 使用Android文件存储方法或者SQLite数据库保存数据,但是开发人员可以使用任何方式存储
- 继承ContentProvider类来提供数据访问
- 在应用程序的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”);
##### 定义内容提供者将返回给客户端的列名: |