android - Android中的@PrimaryKey注释字段不被视为单独的字段吗?
问题描述
我知道当我们想要组合几个字段时使用 @Embedded 注释,然后可以将这些字段表示为一个对象。在 Android Developers 文档中,在定义对象之间的关系文档的一对一关系部分中,我们可以找到以下代码:
@Entity
public class User {
@PrimaryKey public long userId;
public String name;
public int age;
}
@Entity
public class Library {
@PrimaryKey public long libraryId;
public long userOwnerId;
}
在下一节中,关于建模一对一关系,有这段代码说:
public class UserAndLibrary {
@Embedded public User user;
@Relation(
parentColumn = "userId",
entityColumn = "userOwnerId"
)
public Library library;
}
我不明白的是为什么我们只为 User 类使用 @Embedded 注释?Library 类也有几个字段,我们也需要将它们组合起来,对吧?还是因为 @PrimaryKey 字段不被视为单独的字段?
解决方案
@Embedded 注解用于组合多个字段,然后可以将其表示为单个对象
对,那是正确的
但相反的说法是不正确的:
如果你想将多个字段组合成一个对象,你应该只在 Room 中使用 @Embedded 注释
Room 中还有另一种方法可以实现这种“组合”——使用@Relation
. 但是除了“将字段组合成一个对象”@Relation
之外,还需要做一些额外的工作——在内部它会改变你简化的 DAO 查询:
select * from user
,所以你不需要用另一个表写“JOIN”。但是这个“额外”的工作只对第二个表有意义,这就是为什么第一个对象 - with@Embedded
和第二个 - with @Relation
。
例如,您可以不在示例中使用 @Relation:
public class UserAndLibrary {
@Embedded public User user;
@Embedded public Library library;
}
但是要在查询中获得所需的结果,您必须显式使用这两个表并“加入”它们或使用“IN”:
select * from user left join library on user.userId = library.userOwnerId
推荐阅读
- dataframe - 从给定的日期列(pyspark)创建一个日期为 3 年的列?
- ruby - 如何猴子补丁“GC.start”
- c - 在编译时和运行时保证 ASCII 的最佳方法是什么?
- reactjs - 如何使用 React-Redux 和 Apollo-client 设置 React 应用程序的索引文件,以便用户管理能够编辑上下文
- r - 为流图制作表格
- ios - 是否可以使用 IMDF 从 Apple 创建像机场一样的 IndoorMaps?
- c# - 如何在 xaml/uwp 应用程序中刷新 DataGrid
- html - 背景图像未显示在移动浏览器中(但显示在桌面浏览器中)
- python - Scrapy 使用 CSS 提取数据和 excel 将所有内容导出到一个单元格中
- wpf - 更新到 Catel 5.0.0 -- 序列化问题