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
我知道 @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