Android 中的@PrimaryKey 注释字段不被视为单独的字段吗?

Is The @PrimaryKey annotation field in Android not considered as a separate field?

我知道 @Embedded 注释用于当我们想要组合多个字段然后可以表示为单个对象时。在 Android 开发人员文档中,在 定义对象之间的关系 文档的 one-to-one relationships section 中,我们找到以下代码:

@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;
}

我不明白的是为什么我们只为用户使用 @Embedded 注释 class?图书馆 class 也有几个字段,我们也需要将它们组合起来,对吧?还是因为 @PrimaryKey 字段不被视为单独的字段?

@Embedded annotation is used when we want to combine several fields which can then be represented into a single object

是的,没错

但是反过来说是不正确的:

If you want to combine several fields into a single object you SHOULD ONLY use @Embedded annotation in Room

在 Room 中还有另一种方法可以实现此 "combination" - 使用 @Relation。但是除了 "combining fields into a single object" @Relation 做了一些额外的工作 - 在内部它改变了你简化的 DAO 查询:

select * from user

,所以你不需要用另一个table写"JOIN"。但是这个 "additional" 工作只对第二个 table 有意义,这就是为什么第一个对象 - @Embedded 而第二个 - @Relation.

例如,您可以在您的示例中不使用@Relation:

public class UserAndLibrary {
    @Embedded public User user;
    @Embedded public Library library;
}

但是要在您的查询中获得所需的结果,您必须显式地同时使用 table 和 "JOIN" 或使用 "IN":

select * from user left join library on user.userId = library.userOwnerId