Room数据库

时间:2018-01-16 10:50:09

标签: android sql database database-design android-room

我正在使用Room作为应用程序的数据库。我有一个场景,某个类型的Object需要存储在不同的表中。例如,我们可以使用名为Object

Book.java

现在,我想要两个SQL表:

  • Books_Read
  • Books_To_Read

请忽略SQL DB的任何命名约定 - 这只是一个示例

问题

通常情况下,只需在@Entity(tableName = "Books_Read")类中使用Book.java,并拥有一个将使用该表名的DAO类。

事情是;那么我怎样才能使用相同的Book.java类存储在Books_To_Read表中?由于我已将@Entity(tableName = "Books_Read")定义为Book.java类的一部分,因此我看不到在哪里定义Books_To_Read类的Book.java

我能够提出的唯一解决方案是创建一个新类 - 让我们称之为BookToRead.java扩展Book.java并定义{{1} } 在课堂里。

问题

有更好的方法可以做到这一点,还是这是处理它的预期方法?

4 个答案:

答案 0 :(得分:11)

  

这是处理它的预期方法吗?

即可。这是一种错误的做法。您应消除重复数据,原因有多种。

  • 这将耗费存储空间。随着数据库大小的增加,这个 将开始变得更糟。

  • 这会使系统变得复杂。如果您要更新单个 字段,您可能必须在不同的地方执行相同的操作。 如果你错过了其中任何一个,整个数据就会变成 不一致。可以执行诸如此类操作 单笔交易。但保持数据库结构总是更好 干净。


解决方案

方法1:介绍新表格

您只能在一个表"Books"中存储图书的详细信息。 "Books_To_Read"或任何其他表应仅包含对"Books"表的引用(使用"Books"中的id / primary键)。然后,您可以使用JOIN关键字在单个查询中获取整个记录。

如果每种类型(在这种情况下为读取和未读书籍)都有自己的字段集(类似于read_date,read_time用于读取书籍,wish_to_read用于未读书籍),则首选此方法。 />

方法2:引入新字段

您只需添加指定类型的新类型即可。在这种情况下,只有两种类型(读取和未读取),布尔字段(类似is_read)就可以了。

这是最简单的方法。但这只有在您只想指出该行所属的类型时才有效。如果您确实需要存储特定于类型的数据,并为此目的引入了其他字段,请记住这些字段也适用于其他类型。

答案 1 :(得分:1)

这就是我最终解决这个问题的方法:

我在Book.java类中添加了一个ID,表示它是否已被读取。以EnumTypebook_read的{​​{1}}为后盾,然后在book_unread DAO "BooksDataTable"中,我只需使用SQL query select 1}}我想要的ID。因此,通过更改查询,我可以获得所有books_readbooks_to_readall_books。这样,就没有重复的数据,所有内容都在一个表中,而不必使用JOINOneToMany关系。

答案 2 :(得分:0)

@OneToMany(mappedBy="book_id")
private Set<Book> book

我认为这是连接两个表的最佳方法。试试看,让我知道你的    反馈。我会给出一个解决方案

答案 3 :(得分:0)

当Ahamad给出答案时,我正在编写示例应用程序。

  

Room提供了一个基于SQLite的抽象层以允许流畅   利用SQLite的全部功能进行数据库访问。

主要思想与将Book数据存储在一个表中相同,并在其他表中使用该书的id。 看看我的样本project

logcat的结果

02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 2 name = Book 1, author Author 1}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.741 10520-10520/com.example.jingged.roomtest E/MainActivity: Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 3 name = Book 2, author Author 2}
02-19 16:39:26.767 10520-10520/com.example.jingged.roomtest E/MainActivity: BookToRead Book{id = 4 name = Book 3, author Author 3}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 1 name = Book 0, author Author 0}
02-19 16:39:26.768 10520-10520/com.example.jingged.roomtest E/MainActivity: BooksRead Book{id = 2 name = Book 1, author Author 1}