Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-复杂的数据库和内容提供商_Android_Sqlite_Design Patterns_Android Contentprovider_Database Normalization - Fatal编程技术网

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

Android-复杂的数据库和内容提供商,android,sqlite,design-patterns,android-contentprovider,database-normalization,Android,Sqlite,Design Patterns,Android Contentprovider,Database Normalization,我正在设计一个Android应用程序,其数据库结构相当复杂(规范化)。我的问题是,处理数据的最佳设计模式是什么 该数据库有一个表Books、一个表Authors、一个表Collections(of Books)和一个连接表Books_Collections,它们基于一个整数ID将两者关联起来。我说这相当复杂,因为我想在ListView中以“Book Title(Author Name)”的格式显示特定集合中的书籍和作者列表,因此,我需要能够执行以下查询(我将缩写表名A、B、C和B_C): 我见过

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

该数据库有一个表Books、一个表Authors、一个表Collections(of Books)和一个连接表Books_Collections,它们基于一个整数ID将两者关联起来。我说这相当复杂,因为我想在ListView中以“Book Title(Author Name)”的格式显示特定集合中的书籍和作者列表,因此,我需要能够执行以下查询(我将缩写表名A、B、C和B_C):

我见过一些人建议开发人员将他们的Sqlite数据库包装在内容提供商中,以便轻松利用蜂巢中引入的加载程序。但对于如此复杂的查询,这真的可行吗?(如果是的话,怎么做?)或者仅仅使用DAO会更好,因为我没有与其他应用程序共享我的数据?如果使用DAO,是否应创建自定义AsyncTaskLoader以将数据连接到ListView

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

是的,这是可行且容易完成的

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

检查提供程序包,其中有使用该模式所需的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";

}

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

是的,这是可行且容易实现的

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

检查提供程序包,其中有使用该模式所需的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。我找不到大量定制的例子,也没有很好的文档,但也不难理解。工作起来很有魅力。

我最终使用了数据库帮助程序/适配器并创建了一个自定义的AsyncTaskLoader。我找不到大量定制的例子,也没有很好的文档,但也不难理解。工作起来很有魅力。

如果使用ORM,live会更好。如果使用ORM,live会更好。使用provider映射意味着您可以使用provider.query。这特别有用,因为它允许您使用简单的游标加载程序。OP还子类化了
AsyncTaskLoader
,这与使用provider映射意味着您可以使用provider.query具有相同的优势。这特别有用,因为它允许您使用简单的游标加载程序。OP还子类化了
AsyncTaskLoader
,这将具有相同的优势