首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》理解内容提供者

关灯直达底部

内容提供者对数据管理进行封装,因而应用的其他部分,如视图和控制器不需要参与数据的持久化。换句话说,内容提供者对应用数据的持久化是因为视图和控制器本身也不应该处理它。设计优良的代码都是通过专门的软件层处理专门任务,而不会处理其他层的任务。当软件层执行其范畴外的任务时,就会引发bug和不必要的复杂性。因此,UI应该只包含布局良好的UI组件,负责从终端收集事件。精心编写的应用控制器只包含移动应用的域逻辑。在本章,当代码可以把数据持久性委托给第三方即内容提供者时,代码就显得简洁。回顾P260“Android应用中的SQL和数据库为中心的数据模型”一节,内容提供者非常适合实现不以文档为中心的数据模型。

有了内容提供者,应用不需要自己打开SQLite表,因为这些细节会在内容提供者的内部实现。在过去,为了共享数据,移动应用可能需要以配置的形式把它保存在本地文件系统的文件中。在Android中,应用往往可以依赖内容提供者来搞定存储。

在深入探讨SimpleFinchVideoContentProvider之前,将先对Finch视频应用进行简单介绍,以便让读者了解内容提供者是实现任务的背景。

实现内容提供者

要充分发挥这种设计结构的优势,需要实现自己的内容提供者,而且需要完成以下任务:

1.为客户端创建内容提供者的公共API:

a.为内容提供者定义CONTENT_URI

b.创建字段名称,用于和客户端通信

c.声明public static String对象,客户端用它来指定字段

d.为新数据类型定义MIME类型

2.实现自己的内容提供者,需要完成以下任务:

a.扩展主内容提供者API,即ContentProvider类,创建定制的内容提供者

b.设置提供者URI

c.创建SQLite数据库和关联的游标来存储内容提供者的数据

d.使用游标使得客户端可以使用这些数据,并支持动态数据更新

e.定义二进制数据返回到客户端的过程

f.实现Cursor给客户端返回数据的方法query、insert、update和delete

3.更新AndroidManifest.xml文件,声明自己的<provider>。

当完成基础的内容提供者实现后,将对使用内容提供者的任务进行介绍,从而开发更高级的网络架构。

通过Finch浏览视频

Finch视频查看器使用户可以列出和视频相关的元数据。我们将探讨两个版本的视频列表应用及其底层的两个内容提供者。第一个版本是个简单的视频列表应用,它使用了SimpleFinchVideoContentProvider,目的是为了演示如何实现一个自己的内容提供者。该应用的第二个版本将在下一章介绍,它是一个相对稍复杂一些的内容提供者,其增加了从在线的YouTube视频搜索服务中获取数据内容的功能。第二个版本具有缓存结果并显示视频缩略图的功能。

现在,探讨第一个版本。这个简单的应用包含一个活动:SimpleFinchVideoActivity,它支持用户创建并列出自己的视频元数据(如视频标题、描述、URI和ID),如图12-1所示。

图12-1:简单的视频内容提供者,它支持用户输入自己的视频“元数据”

要使用该应用,只需要为video项输入合适的数据,然后按下Insert按钮。文本字段下方的列表就会由Android MVC机制自动刷新数据视图。

简单的视频数据库

为了保存用户通过应用输入的数据,SimpleFinchVideoContentProvider类使用下面这条SQL语句创建了自己的数据库:


CREATE TABLE video (_id INTEGER PRIMARY KEY, title TEXT, decription TEXT, uri TEXT);  

在Android游标系统中,要求使用_id字段。_id字段唯一标识cursor中的一条记录以及数据库中的一个对象。因此,需要通过SQL属性INTEGER PRIMARY KEY AUTOINCREMENT定义该字段,确保它的值是唯一的。

title和description字段分别用来保存视频的标题和描述数据。uri字段保存媒体URI,通过该URI可以在实际的应用中播放视频。

简单版的代码结构

本节将简要介绍简单的Finch视频应用的相关文件。

AndroidManifest.xml

我们为这个视频内容提供者创建了清单文件,它包含SimpleFinchVideoActivity的引用及内容提供者SimpleFinchVideoContentProvider。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/FinchVideo.java

FinchVideo类包含AUTHORITY属性(将在后面讨论它)及SimpleVideo类,它定义了内容提供者字段的名称。FinchVideo类和SimpleVideo类都不包含任何可执行的代码。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/provider/SimpleFinchVideoContent-Provider.java

该SimpleFinchVideoContentProvider类是简单视频数据库的内容提供者,它处理视频应用的URI请求。本节前半部分要探讨的主要就是这个文件。

$(FinchVideo)/src/com/oreilly/demo/pa/finchvideo/SimpleFinchVideoActivity.java

SimpleFinchVideoActivity类是支持用户查看视频列表的活动。