Content Providers
内容提供商管理对一组结构化的数据的访问。它们封装数据,并提供了用于定义数据安全机制。内容提供商的连接在一个过程中的数据与在另一个进程中运行的代码的标准接口。 当您想要访问的内容提供商的数据时,您使用ContentResolver对象在您的应用程序Context中为客户端提供商进行沟通。ContentResolver对象与该提供程序对象,实现ContentProvider的类的实例进行通信。提供程序对象从客户端接收数据的请求,执行请求的操作,并返回结果。
您不需要开发自己的提供程序,如果您不打算与其他应用程序共享您的数据。但是,您需要自己的提供程序,以提供您自己的应用程序的自定义搜索建议。如果您想要复制并粘贴到其他应用程序的应用程序中的文件或复杂数据,您还需要自己的提供程序。
Android 系统本身包括管理数据 (如音频、 视频、 图像和个人联系信息的内容提供商。您可以看到一些人在android.provider包的参考文档中列出。有一些限制,这些提供程序都可以访问任何 Android 的应用程序。 下列主题描述内容提供商的更多详细信息: 内容提供商基础知识
如何访问内容提供商中的数据,当在表中组织数据的。 创建内容提供商
如何创建您自己的内容提供商。 日历提供商
如何访问日历提供程序是 Android 平台的一部分。 联系供应商
如何访问联系人提供程序是 Android 平台的一部分。
Content Provider Basics
内容提供商管理的数据的中央存储库的访问。提供程序是 Android 的应用程序,这通常用于处理数据提供自己的 UI 的一部分。但是,内容提供商主要是为了用于其他应用程序,该提供程序使用提供程序的客户端对象访问。在一起,供应商和供应商的客户端提供一个一致、 标准的接口,还处理进程间通信和安全的数据访问的数据。
本主题描述下列基础知识:
? ? ? ?
内容提供商的工作。
您使用的 API 从内容提供商中检索数据。 API 使用插入、 更新或删除数据的内容提供商。 其他 API 功能,促进与供应商一起工作。
概述
内容提供商将对外部应用程序数据显示为类似于发现在关系数据库中的表的一个或多个表。行表示某些类型的数据提供程序收集、 实例和列中的每一行表示一个单独的部分的数据收集的实例。
例如,在 Android 平台的内置提供程序之一是用户词典,其中存储用户想要保留的非标单词的拼写。表 1 说明了什么数据看上去在此提供程序表中:
表 1:示例用户词典表。
单词 应用程序 id 频率 区域设置 _ID mapreduce 预编译器 小程序 user1 100 en_US 1 user14 200 fr_FR 2 user2 225 fr_CA 3 const user1 255 pt_BR 4 int user5 100 en_UK 5 在表 1 中,每一行表示一个不可能在标准的字典中找到的单词的实例。每一列代表那个词,如语言环境中,它第一次遇到的一些数据。列标题是存储在该提供程序中的列名称。若要引用到行区域设置,可以引用其locale列。为此提供程序, _ID列作为一个提供程序自动维护的\主键\列。
注:一个提供程序并不需要有一个主键,和它不需要使用_ID作为主键的列的名称,如果存在。但是,如果您想要将从供应商的数据绑定到ListView,其中一列的名称必须是_ID。在显示查询结果一节更详细地解释了这一要求.
访问提供商
应用程序从内容提供商ContentResolver客户端对象访问数据。此对象具有同名方法调用中的提供程序对象,一个ContentProvider的具体的子类的实例的方法。ContentResolver方法提供基本的\(创建、 检索、 更新和删除) 的持久性存储功能。
在客户端应用程序的过程中的ContentResolver对象和ContentProvider对象自动拥有该提供程序的应用程序中处理进程间通信。ContentProvider还充当其存储库中的数据和数据作为表的外部外观之间的一个抽象层。
注:若要访问一个提供程序,您的应用程序通常有以请求在其清单文件中的特定权限。这是内容提供商权限部分中更详细的描述
例如,若要从用户词典提供商获得字和其区域设置的列表,您调用ContentResolver.query()。query()方法调用ContentProvider.query()方法由用户词典提供程序定义。下面的代码行显示ContentResolver.query()的调用: // Queries the user dictionary and returns resultsm Cursor = getContentResolver().query( UserDictionary.Words.CONTENT_URI, // The content URI of the words table mProjection, // The columns to return for each row mSelectionClause // Selection criteria mSelectionArgs, // Selection criteria mSortOrder); // The sort order for the returned rows 表 2 显示了如何向
query(Uri,projection,selection,selectionArgs,sortOrder)参数匹配的
SQL SELECT 语句:
表 2:相比,SQL 查询的 query ()。
query () 参数 Uri 选择关键字参数 备注 FROM table_name Uri映射到表中名为table_name的提供程序. projection selection selectionArgs sortOrder ORDER BY col,col,... sortOrder返回Cursor中指定行的显示的顺序. col,col,col,... WHERE col = value projection是应包括为检索每个行的列的数组。 selection指定选择的行的准则。 (无确切等效项。选择参数替换的筛选子句中的?占位符。) 内容的 Uri
URI 的内容是一个 URI,它标识提供程序中的数据。内容的 Uri 包括整个供应商 (及其权力机构) 的符号名称和一个指向 (路径) 的表的名称。当您调用客户端的方法来访问提供程序中的一个表时,表的内容的 URI 是一个参数。
在前面几行代码,恒CONTENT_URI包含内容的用户词典\字\表的 URI。ContentResolver对象解析出的 URI 的权威,并使用它来\解决\通过比较权力下放给已知的供应商的系统表的提供程序。ContentResolver然后可以发送到正确的提供程序的
查询参数。
ContentProvider使用 URI 的内容的路径部分选择要访问的表。提供程序通常有一个公开的每个表的路径。
在前面行,完整的 URI 的\字\表是代码的:
content://user_dictionary/words 凡user_dictionary字符串是提供商的权威,而且words字符串表的路径。该字符串content:// (计划) 总是存在,并确定此为内容的 URI。
许多提供商允许您通过将 ID 值追加到末尾的 URI 来访问表中的单个行。例如,若要检索其_ID是4用户词典中的行,可以使用此内容的 URI:
Uri singleUri = ContentUri.withAppendedId(UserDictionary.Words.CONTENT_URI,4); 你经常使用的 id 值,当你已经检索一组行,然后想要更新或删除其中的一个。
注:Uri和Uri.Builder的类包含用于构造从字符串的格式正确的 Uri 对象的方便方法。ContentUris包含用于将 id 值追加到一个 URI 的方便方法。前面的代码段将使用withAppendedId()将追加到 UserDictionary 内容的 URI 的 id。
从提供程序中检索数据
本节介绍如何从一个供应商,作为示例使用用户词典提供程序中检索数据。
为了清楚起见,本节中的代码片段\线程\上调用ContentResolver.query() \。然而,在实际代码中,你应该做单独的线程上异步查询。若要执行此操作的一种方法是使用CursorLoader类,其中所述的装载机指南中的更多详细信息。代码行,也只有 ; 片段他们不显示完整的应用程序。
要从提供者检索数据,请按照下列基本步骤:
? 请求该提供程序的读访问权限。 ? 定义将查询发送到提供程序的代码。
请求的读访问权限
要从提供者检索数据,您的应用程序提供商需要\的读访问权限\。您不能请求此权限运行时 ;相反,您必须指定您需要此权限在你的清单中,使用