我正在使用Room作为应用程序的数据库。我有一个场景,某个类型的Object
需要存储在不同的表中。例如,我们可以使用名为Object
Book.java
现在,我想要两个SQL表:
请忽略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} } 在课堂里。
问题
有更好的方法可以做到这一点,还是这是处理它的预期方法?
答案 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,表示它是否已被读取。以EnumType
或book_read
的{{1}}为后盾,然后在book_unread
DAO
"BooksDataTable"
中,我只需使用SQL query
select
1}}我想要的ID
。因此,通过更改查询,我可以获得所有books_read
或books_to_read
或all_books
。这样,就没有重复的数据,所有内容都在一个表中,而不必使用JOIN
或OneToMany
关系。
答案 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}