首页 > 解决方案 > 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 字段不被视为单独的字段?

标签: androidandroid-roomone-to-one

解决方案


@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

推荐阅读