1

我正在设计一个具有相当复杂(标准化)数据库结构的 Android 应用程序。我的问题是,处理我的数据的最佳设计模式是什么?

该数据库有一个表 Books、一个表 Authors、一个表 Collections(书籍)和一个连接表 Books_Collections,它基于整数 ID 将两者关联起来。我说这相当复杂,因为我想在 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 中引入的加载器。但这对于如此复杂的查询真的可行吗?(如果是这样,怎么做?)还是只使用 DAO 会更好,因为我不与其他应用程序共享我的数据?如果使用 DAO,是否应该创建自定义 AsyncTaskLoader 以将数据连接到 ListView?

编辑 一个更重要的细节:我想根据 Books 中的布尔变量更改列表项的背景颜色,标记这本书是否已被阅读,并且上下文菜单将允许用户从列表中删除书籍,所以列表需要立即适应数据变化。

4

2 回答 2

1

是的,可行且容易完成

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

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

检查提供程序包,您拥有使用该模式所需的 3 个类

  • 调度数据库.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";

}

然后在您的提供者中将提供者实体映射到此联接。

于 2013-11-08T13:51:32.590 回答
0

我最终使用了数据库助手/适配器并创建了一个自定义 AsyncTaskLoader。我无法找到大量自定义示例,也没有很好的文档,但并不难弄清楚。奇迹般有效。

于 2013-11-08T15:44:18.150 回答