假设我有一个 Order
和 User
Entity
类似于这样的东西:User.java
:
@Entity
public class User {
@PrimaryKey
public long id;
@NonNull
public String username;
}
Order.java
:@Entity(foreignKeys = @ForeignKey(entity = User.class,
parentColumns = "id",
childColumns = "user_id",
onDelete = ForeignKey.CASCADE,
onUpdate = ForeignKey.CASCADE),
indices = @Index("user_id"))
public class Order {
@PrimaryKey
public long id;
public String description;
@ColumnInfo(name = "user_id")
public long userId;
@Ignore
private User user;
}
所以这样,我有一个
Order
与 User
在其中,在数据库中,我仅将此与用户 ID 的关系保存为 Foreign Key
而不是对象本身(它是 @Ignore
d),所以一切都很好并且是相关的,并且可以扩展为以几种不同的方式和查询等与其他类型一起使用。现在,问题是,我如何获得
Order
与 User
对象自动填充在 Room 里面吗? 如果我使用
@Embedded
,然后 Order
和 User
将住在同一张 table 上,这不利于类型的关系分离。我可以将它们连同 JOIN
一起退回。但这仍然只适用于具有不同名称的数据类型(也许它们都有一个名为“描述”的列?),此外,插入 Order
与 User
在里面它不会是简单的 JOIN
. @Relation
仅适用于一对多,它需要 List
,这不是我的情况。我想也许是
@TypeConverter
将是这里的最佳选择,在 long
之间转换和 User
,但这也很棘手。 @TypeConverter
需要引用 DAO
所以它可以查询User
和 @TypeConverter
是一个静态方法,由 Room 调用,因此传递 DAO
除了对每个 User
的额外查询之外,可能会很棘手并导致许多代码异味会触发多个不在同一个 @Transaction
中的搜索.我是 Room 的新手,但我敢打赌,有一种正确的方法可以解决这个问题,将 Room 与原本打算使用的关系类型一起使用,我只是不知道如何简单而好地完成这项工作,我也找不到它在任何文件中。
最佳答案
Now, the question is, how do I get an Order with the User object automatically populated by Room inside it?
我认为没有一个开箱即用的解决方案。
恕我直言,实体模型(即
Order
将 FK 与 User.id
映射)不应该传播到上层类似于域/表示层,提供 DataMapper
将实体模型转换为上层的域模型(即 User
包含 Order
)可能是更好的选择。
关于android - 如何处理Room中嵌套的1对1对象中的关系数据(将ForeignKey转换为对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51958403/