自定义ContentProvider,用于具有多个表的复杂sql数据库

时间:2012-04-30 21:06:23

标签: android android-contentprovider

我正在尝试创建一个包含已编写应用程序功能的库。旧的应用程序使用复杂的sqlite数据库。我正在尝试重用旧数据库作为内容提供商的后端,并且无法弄清楚我正在尝试做什么以及如何调整各种示例(this,{ {3}}和其他人)我已经找到了我的情况。

Supoose你有这个数据库结构

+------+-------------+-------------+-------------+
| Root |   Folder    |    Item     |  Subitem   |
+------+-------------+-------------+-------------+
| _id  | _id         | _id         | _id         |
| uuid | parent_uuid | parent_uuid | parent_uuid |
|      | uuid        | uuid        | uuid        |
|      | name        | name        | name        |
|      | data        | data        | data        |
+------+-------------+-------------+-------------+
Root->Folder->Item->Subitem

之前,我使用了一个DbAdapter类,我提供了函数调用,它接受了诸如parent_uuid之类的参数,处理了函数内部的所有sql查询内容,然后返回了带有结果的游标

示例函数存根:

  • get_items_by_parent_uuid(folder_uuid)
  • get_item_by_uuid(UUID)
  • 同样适用于Subitem

复杂查询

  • get_items_for_root(root_uuid)
    • 使用项目uu​​id,项目名称,项目数据,文件夹名称
    • 返回光标
  • get_items_with_subitem_count(folder_uuid)
    • 使用项目uu​​id,项目名称,项目数据,子项目计数返回游标,其中subitem.parent_uuid == item.uuid

我无法找出使用1 ContentProvider提供上述功能的最佳方法。 我不需要有人给我写大量的代码(但如果你这样做我也很好),我只是希望有人帮助我理解如何修改上面链接的例子来做这些事情,因为我主要做理解这些例子,但还不足以将它们转化为我目前的需求。

TL; DR; - 如何编写处理多个表的单个ContentProvider,不依赖于_id作为唯一标识符,并处理连接以及可能的选择有内部选择/查询(例如select count(*)

1 个答案:

答案 0 :(得分:3)

  

如何编写处理多个表的单个ContentProvider

步骤1:为您的模式设计一个REST接口,将自己限制为一个简单的JSON对象作为数据结构(即,没有嵌套的数组或对象,只是简单值的键映射)

步骤2:将该设计转换为ContentProvider,将http://sooperapp.jp36.com/替换为content://com.jp36.sooperapp,并将JSON替换为CursorsContentValues

因此,举例来说,您可能会支持content://com.jp36.sooperapp/foldercontent://com.jp36.sooperapp/item以及content://com.jp36.sooperapp/subitem作为检索/修改每种类型中的一种或多种信息的基础。

  

不依赖于_id作为唯一标识符

如果你计划使用CursorAdapter,并假设uuid你确实是指一个UUID(通常是一个字符串),那么你别无选择,只能拥有_id }。但是,如果您不打算使用CursorAdapter,则不需要_id

  

并处理连接以及可能具有内部选择/查询的选择(例如选择计数(*))

这完全取决于您的REST接口/ ContentProvider设计。如果您希望content://com.jp36.sooperapp/folder/count成为您在此后面查询的内容,那么SELECT COUNT(*) FROM Folder会将您自己解雇。

(注意:不要自欺欺人)

如果您希望content://com.jp36.sooperapp/omg/omg/omg/this/is/a/long/path INSERT ItemSubitems基于对提供商的insert()次呼叫,请直接前进。 ContentProvider仅仅是一个立面;由您来定义Uri的含义,ContentValues的含义,query()参数的含义等等。

就个人而言,我建议您退后一步,问问自己为什么要打扰ContentProvider