android - Room数据库中具有相同类型对象的多个表

标签 android sql database database-design android-room

我使用 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/

相关文章:

java - android中的密码验证确认

android - 由于 AndroidManifest.xml 存在问题,无法构建 APK

MySQL 全文搜索没有匹配项

SQL 按客户端位置分组

mysql - 如何记录/写入查询执行期间发生的错误和警告

android - 可重用组件 : toolbar like in astro app for Android

java - 融合位置管理器 API 准确性

SQL Server 2008 : Joining results of STORED PROCEDURE (dynamic columns) with results of a SELECT statement

mysql - 如果不存在则删除

mysql - SQL COUNT 国籍,具有不止一位艺术家和该国籍的艺术家数量