我正在尝试创建一个包含已编写应用程序功能的库。旧的应用程序使用复杂的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查询内容,然后返回了带有结果的游标
示例函数存根:
复杂查询
我无法找出使用1 ContentProvider
提供上述功能的最佳方法。
我不需要有人给我写大量的代码(但如果你这样做我也很好),我只是希望有人帮助我理解如何修改上面链接的例子来做这些事情,因为我主要做理解这些例子,但还不足以将它们转化为我目前的需求。
TL; DR; - 如何编写处理多个表的单个ContentProvider
,不依赖于_id作为唯一标识符,并处理连接以及可能的选择有内部选择/查询(例如select count(*)
)
答案 0 :(得分:3)
如何编写处理多个表的单个ContentProvider
步骤1:为您的模式设计一个REST接口,将自己限制为一个简单的JSON对象作为数据结构(即,没有嵌套的数组或对象,只是简单值的键映射)
步骤2:将该设计转换为ContentProvider
,将http://sooperapp.jp36.com/
替换为content://com.jp36.sooperapp
,并将JSON替换为Cursors
和ContentValues
因此,举例来说,您可能会支持content://com.jp36.sooperapp/folder
和content://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
Item
和Subitems
基于对提供商的insert()
次呼叫,请直接前进。 ContentProvider
仅仅是一个立面;由您来定义Uri
的含义,ContentValues
的含义,query()
参数的含义等等。
就个人而言,我建议您退后一步,问问自己为什么要打扰ContentProvider
。