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

《Android程序设计:第2版》编写并集成内容提供者

关灯直达底部

前面探讨了简单视频列表应用的总体结构,为客户端提供了访问内容提供者的方式,现在一起来看看在应用中如何使用SimpleFinchVideoContentProvider。

常见的内容提供者任务

在后面各节中,首先提供一份编写内容提供者的高级指南,然后介绍Android MVC,最后详细解释SimpleFinchVideoContentProvider的实现代码。

扩展ContentProvider

应用扩展ContentProvider类以处理特定数据类型的URI,如MMS消息、图片和视频等。例如,对于处理视频的内容提供者,ContentProvider.insert方法会把视频的描述数据插入到SQLite表中,每个字段表示特定的信息,如标题、描述等信息。

可以从下面两个方法的实现入手,开始编写自己的内容提供者。

onCreate

该方法提供hook,支持内容提供者执行初始化。任何只想执行一遍的代码,如连接数据库,都应该在onCreate方法中实现。

String getType(Uri uri)

该方法从给定的URI中提取出内容提供者集成在URI中的MIME类型。URI来源于对数据访问感兴趣的客户端应用。

可以重写主内容提供者的数据访问方法:

insert(Uri uri,ContentValues values)

当客户端需要把数据插入到内容提供者的数据库时,会调用insert方法。通常情况下,该方法的实现就是直接或间接地触发数据库的插入操作。

cursor query(Uri uri,Stringprojection,String selection,StringselectionArgs,String sortOrder)

当客户端想要从内容提供者的数据库中读取数据时,会调用query方法。一般而言,使用SQL SELECT语句检索数据,返回包含该请求的数据的cursor。开发人员使用Activity的managedQuery方法间接调用这个方法,或把该方法的返回值传递给startManagingQuery方法并调用。如果活动无法“托管”返回的游标,或关闭游标失败,应用会出现严重的内存泄露,可能会导致应用的性能变差甚至崩溃。

update(Uri uri,ContentValues values,String selection,StringselectionArgs)

当客户端想要更新内容提供者数据库的一条或多条记录时,会调用这个方法。该update方法会被翻译成SQL的UPDATE语句执行。

delete(Uri uri,String selection,StringselectionArgs)

当客户端想要删除内容提供者数据库中的一条或多条记录时,会调用delete方法。该方法会被翻译成SQL的DELETE语句被执行。

这4个方法都在给定的URI参数所对应的数据上执行操作。每种方法的经典实现都是从把输入的URI参数和特定的数据类型进行匹配开始的。例如,内容提供者的实现需要弄清给定的URI是否指向某个专门的视频,或者一组视频。当内容提供者和URI匹配后,就会执行相应的SQL操作。然后,每个方法会返回一个值或者引用的数据,描述受影响的数据,或者返回被操作影响到的元素数量。例如,如果给定的URI指向的是本地表中的某个元素,则这个视频查询就会返回一个先标,其中包含一个视频元素。

把URI和表中的数据进行匹配是内容提供者工作的一部分。虽然你可能觉得自己解析内容提供者URI也不是很困难,但Android提供了良好的工具来执行这个操作,这个工具使用起来很方便,而且更重要的是,它可以帮助开发人员对提供者URI的格式进行标准化。URIMatcher类支持把包含authority、path和ID字符串的URI映射到应用定义的常量,可以使用case语句处理特定类型的URI。这里,提供者可以决定应该使用什么样的SQL操作来管理真正的表记录。传统的内容提供者会创建URIMatcher的静态实例,使用静态初始化程序对它执行实例化,这个静态初始化程序会调用URI的Matcher.addURI方法建立在后面的内容提供者数据方法中会使用的一级映射。在P335“SimpleFinch VideoContent Provider类和实例变量”一节给出的视频内容提供者就是这样实现的。