Android - 复杂数据库和内容提供商

时间:2013-10-29 18:06:42

标签: android sqlite design-patterns android-contentprovider database-normalization

我正在设计一个具有相当复杂(规范化)数据库结构的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?

修改的 一个更重要的细节:我想根据书中的布尔变量更改列表项的背景颜色,标记书是否已被读取,上下文菜单将允许用户从列表中删除书籍,因此列表需要立即调整数据变化。

2 个答案:

答案 0 :(得分:1)

是的,可行且容易完成

我不是专家,但我遵循谷歌在他的Google I / O应用程序上使用的模式

https://code.google.com/p/iosched/

检查提供程序包,其中包含使用模式所需的3个类

  • ScheduleDatabase.java

(sqlite3数据库的定义)

  • ScheduleProvider.java

(附加到此数据库的内容提供商)

  • ScheduleContract.java

(合同定义为公开提供者)

就个人而言,在加入的情况下

在我定义的数据库文件中

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。我无法找到大量的自定义示例,并且没有很好的文档,但它并不难理解。像魅力一样。