我使用 Room 作为应用程序的数据库。我有一个场景,其中某种类型的 Object
需要存储在单独的表中。举个例子,我们以 Object
为例子,名为 Book.java
现在,我想要两个 SQL 表:
- Books_Read
- Books_To_Read
请忽略 SQL DB 的任何命名约定 - 这只是一个示例
问题
通常,在 Book.java
类中使用 @Entity(tableName = "Books_Read")
并有一个 DAO
类这将使用该表名。
问题是;那么我如何能够使用相同的 Book.java
类存储在 Books_To_Read
表中?由于我已经将 @Entity(tableName = "Books_Read")
定义为 Book.java
类的一部分,我看不到在哪里定义 Books_To_Read
Book.java
类的表
我能想出的唯一解决方案是创建一个新类,这似乎有点骇人听闻和不合情理 - 我们称之为 BookToRead.java
扩展 Book.java
并在类中定义 @Entity(tableName = "Books_To_Read")
。
问题
有没有更好的方法来做到这一点,或者这是处理它的预期方法?
最佳答案
Is this the expected way to handle it?
否。这是一种错误的做法。出于多种原因,您应该消除数据重复。
这会消耗存储空间。随着数据库大小的增加,这 会开始变得更糟。
这会使系统变得复杂。如果您要更新单个 字段,您可能必须在不同的地方执行相同的操作。 如果你错过其中任何一个,整个数据将变成 不一致。可以执行如下操作 单笔交易。但最好保持数据库结构 干净。
解决方案
方法一:引入新表
您可以将书籍的详细信息存储在一张表中,例如 "Books"
。 "Books_To_Read"
或任何其他表应仅包含对 "Books"
表的引用(通过使用 "Books"中的 id/主键
表)。然后,您可以使用 JOIN
关键字在单个查询中获取整条记录。
如果每种类型(在本例中为已读和未读书籍)都有自己的一组字段,则首选此方法(如 read_date、read_time 用于已读书籍,wish_to_read 用于未读书籍)。
方法二:引入新领域
您可以简单地添加一个指定类型的新类型。在这种情况下,只有两种类型(已读和未读),一个 bool 字段(类似于 is_read
)就可以了。
这将是最简单的方法。但这仅在您只想指示该行属于哪种类型时才有效。如果您确实需要存储特定于类型的数据并为此目的引入了其他字段,请记住这些字段也适用于其他类型。
关于android - Room数据库中具有相同类型对象的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279481/