首页 理论教育 ContentProviders与数据存储

ContentProviders与数据存储

时间:2023-06-15 理论教育 版权反馈
【摘要】:如果一个Content Providers管理多个数据集,其将会为每个数据集分配一个独立的URI。而在ContentResolver查询过程的开始,Android系统将会确定查询所需具体的Content Providers,确认它是否启动并运行它。Android系统还负责初始化所有的Content Providers,不需要用户自己去创建。查询记录在Content Providers中使用的查询字符串有别于标准的SQL查询。表13-2 Content Providers URI示例尽管这种查询字符串格式很常见,但是它看起来还是有些令人迷惑。在实际的开发中,大多数情况使用的是系统提供的Content Providers。

ContentProviders与数据存储

Content Providers是Android平台中重要的组件之一,它提供了一套标准的接口用来实现数据的增、删、改、查,可以使各个应用程序之间实现数据共享。我们可以获得系统内部共享资源(如音频、视频、图像和联系人等),还可以自定义应用程序的Content Providers,为其他应用程序提供访问自身数据的接口。

Content Providers是如何存储数据的呢?首先Content Providers把它的数据作为数据库模型上的单一数据表提供出来,在数据表中,每一行是一条记录,每一列代表着某一特定类型的值。如表13-1所示,显示的是联系人信息的数据模型。

表13-1 Content Providers数据模型

978-7-111-37968-3-Chapter13-43.jpg

每一个Content Providers都会对外提供一个URI作为其唯一标识自己的数据集(data set),在与其他程序互动的过程中都会使用到这个常量,格式如图13-17所示。如果一个Content Providers管理多个数据集,其将会为每个数据集分配一个独立的URI。所有的Content Providers的URI都以“content://”开头,其中“content:”是用来标识数据是由Content Providers管理的schema。

978-7-111-37968-3-Chapter13-44.jpg

图13-17 Content ProvidersURI组成

那么,Content Providers如何进行增、删、改、查及自定义Content Providers的操作呢,具体实现步骤如下:

(1)创建Content Providers

创建Content Providers需要获取一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法来获得,代码如下:

978-7-111-37968-3-Chapter13-45.jpg

ContentResolver这一方法可实现找到指定的Content Providers(内容提供者)并获取到Content Providers的数据。而在ContentResolver查询过程的开始,Android系统将会确定查询所需具体的Content Providers,确认它是否启动并运行它。Android系统还负责初始化所有的Content Providers,不需要用户自己去创建。实际上,Content Providers的用户都不可能直接访问到Content Providers实例,只能通过ContentResolver从中间进行代理间接实现访问。

(2)查询记录

在Content Providers中使用的查询字符串有别于标准的SQL查询。诸如select、add、delete、modify等操作都使用一种特殊的URI来进行,这种URI由3个部分组成。如“content://”代表数据的路径,后接一个可选的标识数据的ID。表13-2是一些URI示例。

表13-2 Content Providers URI示例

978-7-111-37968-3-Chapter13-46.jpg

尽管这种查询字符串格式很常见,但是它看起来还是有些令人迷惑。为此,Android提供一系列的帮助类(在android.provider包下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让开发者理解,示例代码如下:

978-7-111-37968-3-Chapter13-47.jpg

因此,如上面所讲的示例content://contacts/people/50,这个URI就可以写成如下形式:

978-7-111-37968-3-Chapter13-48.jpg

再执行数据查询:

978-7-111-37968-3-Chapter13-49.jpg

这个查询返回一个包含所有数据字段的游标,可以通过迭代这个游标来获取所有的数据。查询功能在Content Providers中相当重要,下面通过示例代码巩固这一知识点。代码的主要功能是:依次读取联系人信息表中指定用户的数据列name和number。

978-7-111-37968-3-Chapter13-50.jpg

978-7-111-37968-3-Chapter13-51.jpg

(3)修改记录

可以使用ContentResolver.update()方法来修改数据,具体方法如下:

978-7-111-37968-3-Chapter13-52.jpg

这样就可以调用上面的方法来更新指定记录,实现代码如下:

978-7-111-37968-3-Chapter13-53.jpg

(4)添加记录

要增加记录,可以调用ContentResolver.insert()方法。该方法接收一个要增加的记录的目标URI以及一个包含了新记录值的Map对象,调用后的返回值是新记录的URI,包含记录号。

在上面的示例中,都是基于联系人信息簿这个标准的Content Providers,现在继续用它来创建一个insertRecord()方法来对联系人信息簿中进行数据的添加:

978-7-111-37968-3-Chapter13-54.jpg

这样就可以调用insertRecords(name,phoneNo)来向联系人信息簿中添加联系人姓名和电话号码了。

(5)删除记录

Content Providers中提供了getContextResolver.delete()方法用来删除记录,下面的代码用来删除手机设备上所有的联系人信息:

978-7-111-37968-3-Chapter13-55.jpg(www.xing528.com)

也可以指定WHERE条件语句来删除特定的记录,如:

978-7-111-37968-3-Chapter13-56.jpg

(6)自定义Content Proviser

可以通过自定义一个继承于ContentProvider的类来编写属于自己的ContentProvider。在该类中通过重写基类中的方法,用来提供给外部操作的接口。如何在方法内部组织和存储数据,则由开发者自定义。数据存储的类型既可以使用数据库存储,也可使用XML存储方式。总之,不管采用哪种机制,外部用户关注的仅仅是可操作的接口。在实际的开发中,大多数情况使用的是系统提供的Content Providers。由于很少情况自定义Content Providers,而且模式相对较为固定,所以我们在使用时可以参照现有资料或API示例即可。

下面通过一个示例讲述Content Providers数据存储的使用方法,代码实现功能是读取自建的电话簿信息(ID,TITLE,NOTE)。示例代码运行结果如图13-18至图13-20所示。

978-7-111-37968-3-Chapter13-57.jpg

图13-18 Content Providers存储示例代码运行结果(1)

978-7-111-37968-3-Chapter13-58.jpg

图13-19 Content Providers存储示例代码运行结果(2)

978-7-111-37968-3-Chapter13-59.jpg

图13-20 Content Providers存储示例代码运行结果(3)

首先,介绍如何通过xml布局实现界面效果,如代码清单13-10所示。

代码清单13-10 Content Providers数据存储示例(第13章\Demo_13_04)main.xml

978-7-111-37968-3-Chapter13-60.jpg

978-7-111-37968-3-Chapter13-61.jpg

其次,介绍Activity java代码如何配合布局实现Content Providers数据存储操作,如代码清单13-11至代码清单13-14所示。

代码清单13-11 ContentProviders数据存储示例(第13章\Demo_13_04)MainActivity.java

978-7-111-37968-3-Chapter13-62.jpg

978-7-111-37968-3-Chapter13-63.jpg

代码清单13-12 Content Providers数据存储示例(第13章\Demo_13_04)Contact UserProvider.java

978-7-111-37968-3-Chapter13-64.jpg

978-7-111-37968-3-Chapter13-65.jpg

978-7-111-37968-3-Chapter13-66.jpg

978-7-111-37968-3-Chapter13-67.jpg

978-7-111-37968-3-Chapter13-68.jpg

978-7-111-37968-3-Chapter13-69.jpg

代码清单13-13 Content Providers数据存储示例(第13章\Demo_13_04)ContactUser.java

978-7-111-37968-3-Chapter13-70.jpg

978-7-111-37968-3-Chapter13-71.jpg

代码清单13-14 Content Providers数据存储示例(第13章\Demo_13_04)ContentProviderDemo.java

978-7-111-37968-3-Chapter13-72.jpg

978-7-111-37968-3-Chapter13-73.jpg

978-7-111-37968-3-Chapter13-74.jpg

最后,需要在AndroidManifest.xml要添加访问权限,具体如代码清单13-15。

代码清单13-15 Content Providers数据存储示例(第13章\Demo_13_04)AndroidManifest.xml

978-7-111-37968-3-Chapter13-75.jpg

978-7-111-37968-3-Chapter13-76.jpg

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈