繁体   English   中英

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

[英]Android - Complex Databases and Content Providers

我正在设计一个具有相当复杂(规范化)数据库结构的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中引入的Loader。 但这对于如此复杂的查询真的可行吗? (如果是,怎么办?)还是仅使用DAO会更好,因为我不与其他应用程序共享数据? 如果使用DAO,是否应该创建一个自定义AsyncTaskLoader来将数据连接到ListView?

编辑一个更重要的细节:我想基于“书籍”中的一个布尔变量更改列表项的背景颜色,该变量用于标记是否已阅读该书籍,并且上下文菜单将允许用户从列表中删除书籍,因此列表需要立即调整以适应数据更改。

是的,可行且容易完成

我不是专家,但我会遵循Google在其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";

}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM