目录
10.数据存储技术(四)
4.使用Content Provider实现数据共享
Content Provider 主要用于在不同的应用程序之间实现数据共享。它提供了一套完整的机制, 允许一个程序访问另一个程序中的数据,同时还能保证被访问数据的安全性。
在Android程序中,共享数据的实现需要继承ContentProvider基类,该基类为其他应用程序使用和存储数据实现了一套标准方法,然而应用程序并不直接调用这些方法,而是使用一个ContentResolver对象去操作指定数据。
4-1.Content Provider概述
Content Provider内部如何保存数据由其设计者决定,但是所有的Content Provider都实现一组通用的方法,用来提供数据的增、删、改、查功能。
客户端通常不会直接使用这些方法,而是通过ContentResolver对象实现对Content Provider的操作。开发人员可以通过调用Activity或者其他应用程序组件的实现类中的getContentResolver()方法来获得ContentResolver对象,例如:
ContentResolver cr = getContentResolver();
使用ConentResover提供的方法可以获得Content Provider 中任何想要的数据。
当开始查询时,Android 系统确认查询的目标Conent Provider 并确保它正在运行。系统会初始化所有ContentProvider类的对象,开发人员不必完成此类操作,实际上,开发人员根本不会直接使用ContentProvider类的对象。通常,每个类型的Content Provider仅有一个单独的实例。但是该实例能与位于不同应用程序和进程的多个ContentResolver类的对象通信。不同进程之间的通信由ContentProvider类和ContentResolver类处理。
使用Content Provider时,通常会用到以下两个概念。
1.数据模型
Content Provider使用基于数据库模型的简单表格来提供其中的数据,这里每行代表一条记录, 每列代表特定类型和含义的数据。例如,联系人的信息可能以表10.2 所示的方式提供。
表10.2 联系方式
_ID | NAME | NUMBER | |
---|---|---|---|
001 | 张XX | 123*** | 123**@163.com |
002 | 王XX | 132*** | 132**@google.com |
每条记录包含一个数值型的_ID字段,用于在表格中唯一标识该记录。 _ID 能用于匹配相关表格中的记录,例如,在一个表格中查询联系人的电话,在另一表格中查询其照片。
注: _ID 字段前还包含了一条下划线,在编写代码时不要忘记。
查询返回一个Cursor对象,它能遍历各行各列来读取各个字段的值。对于各个类型的数据,它都提供了专用的方法。因此,为了读取字段的数据,开发人员必须知道当前字段包含的数据类型。
2.URI的用法
每个Content Provider提供公共的URI(使用Uri类包装)来唯一标识其数据集。 管理多个数据集(多个表格)的Content Provider 为每个数据集提供了单独的URI。所有为Content Provider提供的URI都以“content://”作为前缀,它表示数据由Content Provider来管理。
如果自定义Content Provider,则需要为其URI也定义一个常量,来简化客户端代码并让日后更新更加简洁。Android为当前平台提供的Content Provider定义了CONTENT_URI常量。例如,匹配电话号码到联系人表格的URI和匹配保存联系人照片表格的URI分别如下:
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI
URI常量用于所有与Contlenr Povider的交互中。每个ContentResolver方法使用URI作为其第一个参数。它标识ContentResolver应该使用哪个Content Provider及其中的哪个表格。
例:
content://com.example.employeeprovider/person/001
◆content://:标准的前缀,用于标识该数据由Content Provider管理,不需修改。
◆com.example.employeeprovider:URI的权限(authority) 部分,用于对不同的应用程序做区分,一 股会采用完整的类名(使用小写形式)来保证其唯一性。例如,一个包名为com.example的应用,对应的权限就可以命名为com.example.provider。
◆/person/001:Content Provider的路径(path)部分,用于指定要操作的数据,可以是数据表、文件、XML等。例如,要访问数据表person中的所有记录,可以使用“/person" ;而要访问person中的ID为001的记录的name字段,则需要使用“/person/001/name'
◆/001:被请求的特定记