使用内容提供器来复制复杂的数据
内容提供器支持复制诸如数据库记录或文件流等复杂数据。要复制这样的数据,你就要把一个内容的URI放到剪贴板上。然后粘贴数据的应用程序重剪贴板上获取这个URI,并且使用它来获取数据库数据或文件流的描述符。
因为粘贴数据的应用程序只有数据的URI,所以它需要知道要或获取的数据的位置。你可以通过URI中的数据标识编码来提供这个信息,或者提供你所希望复制数据的唯一URI。你所选用的技术要依赖你的数据的组织形式。
下面介绍如何建立URI、如何提供复杂数据以及如何提供文件流。这些介绍会假定你已经熟悉了内容提供器设计的一般原则。
在URI中对数据标识进行编码
对于使用URI把数据复制到剪贴板的一项有用的技术就是在URI中包含对应数据标识的编码。然后你的内容提供器从该URI中获取这个标识,并使用它来获取数据。粘贴数据的应用程序不必了解该标识是否存在,它要做的所有工作就是从剪贴板中获取你的引用(URI+数据标识),然后把它交给内容提供器,并获取返回的数据。
通常你会把标识编码串联在内容URI的末尾。例如,假设你定义了下列字符串作为内容提供器的URI:
"content://com.example.contacts"
如果你想要把一个名称编码放到这个URI中,你会使用以下代码:
String uriString = "content://com.example.contacts" + "/" + "Smith"
// uriString now contains content://com.example.contacts/Smith.
// Generates a uri object from the string representation
Uri copyUri = Uri.parse(uriString);
如果你已经使用了一个内容提供器,你可能想要指定一个新的URI路径来用于复制数据。例如,假设你已经有了以下URI路径:
"content://com.example.contacts"/people
"content://com.example.contacts"/people/detail
"content://com.example.contacts"/people/images
你可以添加另外的特定的用于复制的URI路径:
"content://com.example.contacts/copying"
然后你可以通过模式匹配来检查用于复制的URI,并且用特定的复制和粘贴的代码来处理它。
通常,如果你使用的内容提供器用内部的数据库或内部的表来组织数据,那么你就要使用这种编码技术。在这些情况中,你可能希望复制多个数据段,并且每段数据都一个唯一的标识。在对应的粘贴数据的应用程序中,你可以通过他们的标识来查找数据并返回它。
如果你要复制的不是多个数据段,那么就不需要对一个标识进行编码。你可以简单的把唯一的URI提供给内容提供器。在对应的查询中,你的内容提供器会返回当前所包含的数据。
在Note Pad示例应用程序中通过使用一条记录的ID来打开一个来自笔记列表的笔记记录。这个示例程序使用来SQL数据库的_id字段,但是你可以使用任何你所希望的数字或字符标识。