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

《Android程序设计:第2版》第12章 使用内容提供者

关灯直达底部

在Android应用间共享数据时,位于应用的数据库内部的数据需要依靠内容提供者API才能被从外部访问。例如,Android联系人内容提供者对于可以重用在Android平台上的持久存储的联系人信息的应用的数量不设上限。只需简单地调用这个内容提供者,应用就可以访问存储在本地的用户联系方式,并能和Google的云存储同步。应用不需要提供其数据库操作代码就可以读写内容提供者中的数据。通过这种方式,内容提供者提供了强大的功能,它使得开发人员很容易创建具有复杂的数据管理功能的应用——在很多情况下,应用本身只需要编写很少的数据持久性代码。

内容提供者API支持客户端上的应用使用统一资源定位符(URI)查询OS以获取相关数据,这和浏览器从互联网请求信息类似。对于给定的URI查询,客户端并不清楚哪个应用会提供数据;它只是通过URI向操作系统发出请求,由Android平台负责启动合适的应用以提供查询结果。Android平台还支持客户端对内容提供者数据访问权限进行限制。

内容提供者API支持对共享内容的完整操作权限,具体包括:创建、读取、更新和删除。这意味着应用可以使用面向URI的请求来使用这些API:

·创建新的记录

·检索一条、所有或一些记录

·更新记录

·删除记录

本章将通过介绍一个名为SimpleFinchVideoContentProvider的示例内容提供者的内部工作机制来说明如何编写自己的内容提供者。SimpleFinchVideoContentProvider的实现在Finch源代码树中。所有相关的文件都在本章的源代码目录中。本节中要用到的AndroidManifest.xml文件的引用是$(FinchVideo)/AndroidManifest.xml。我们会实现主体的ContentProvider类所需要的每个方法,并通过这些实现代码来介绍如何创建一个内容提供者。还将解释如何把SQLite数据库集成到内容提供者中。本节也会描述如何实现内容提供者的基础功能,这些基础功能在数据和数据库记录的URI之间建立起了一个映射关系。你将看到,内容提供者是如何封装数据持久性功能的,当你在文件AndroidManifest.xml中声明了内容提供者时,最终其内部是如何实现对进程间共享数据功能的支持的。还将说明如何把内容提供者数据挂接到Android UI组件中,从而完成本书提到的MVC架构。最后,将构建查看数据的活动,它会随着数据而变化,自动刷新显示的内容。

注意:在本章中,假定本地内容提供者存储使用的是SQLite数据库。给定内容提供者的API方法query、insert、update和delete,但仍然需要费一番思量来考虑如何将这些方法映射到其他方法。虽然理论上这些API背后的存储和检索可以使用任何方式,例如可以使用一个普通的文件来支持所需要的操作,但这种方式实在不够理想。

下一章将说明如何扩展和增强内容提供者的概念。其中,你将了解如何充分利用内容提供者API来把RESTful网络服务集成到Android中。虽然这种简单的架构只是依赖于基础的Android组件,但是它可以避免很多常见的移动编程错误。你会发现这种方法所形成的结构在逻辑上显著增强了Android应用的稳定性,同时还提高了性能。

我们将完整说明一个视频列表应用,这个应用简单说明了这种架构。该应用遵循了推荐的处理模式:先加载,然后解析,最后缓存来自http://gdata.youtube.com的RESTful Web服务中的YouTube视频内容。将使用gData作为RESTful服务例子,并将该服务集成到Android内容提供者中。应用的UI将使用内容提供者动态地显示从网络上获取到的视频条目。可以应用这种方法,把互联网上的大量的web服务集成到基于Android的应用中。顺便提一下,gData URI提供了很整洁的demo程序,值得下一看。