我正在设计一个具有相当复杂(规范化)数据库结构的Android应用程序。我的问题是,使用我的数据的最佳设计模式是什么?
数据库有一个表Books,一个表Authors,一个表Collections(书籍),以及一个基于整数ID关联两者的联结表Books_Collections。我说它相当复杂,因为我想要显示一系列书籍和作为ListView中特定集合的作者,格式为“书名(作者姓名)”,因此我需要能够执行以下查询(我将缩写表名A,B,C和B_C):
SELECT B.title, A.name
FROM B
JOIN A ON B.author_id = A.id
JOIN B_C ON B_C.book_id = B.id
WHERE B_C.collection_id = [variable]
我见过一些人建议开发人员将他们的Sqlite数据库包装在Content Provider中,以便轻松利用Honeycomb中引入的Loaders。但这对于这种复杂的查询真的可行吗? (如果是这样,怎么样?)或者因为我不与其他应用程序共享我的数据而使用DAO会更好吗?如果使用DAO,是否应该创建自定义AsyncTaskLoader以将数据连接到ListView?
修改的 一个更重要的细节:我想根据书中的布尔变量更改列表项的背景颜色,标记书是否已被读取,上下文菜单将允许用户从列表中删除书籍,因此列表需要立即调整数据变化。
答案 0 :(得分:1)
是的,可行且容易完成
我不是专家,但我遵循谷歌在他的Google I / O应用程序上使用的模式
https://code.google.com/p/iosched/
检查提供程序包,其中包含使用模式所需的3个类
(sqlite3数据库的定义)
(附加到此数据库的内容提供商)
(合同定义为公开提供者)
就个人而言,在加入的情况下
在我定义的数据库文件中
interface Tables {
String TABLE1= "table1";
String TABLE2= "table2";
// JOINS
String TABLE1_JOIN_TABLE2 = "table1"
+ "LEFT OUTER JOIN table2 ON table1.table_id= table2.tableid";
}
然后在您的提供程序中将提供程序实体映射到此联接。
答案 1 :(得分:0)
我最终使用数据库助手/适配器并创建自定义AsyncTaskLoader。我无法找到大量的自定义示例,并且没有很好的文档,但它并不难理解。像魅力一样。