假设我有一个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
,在数据库中我只将用户标识的关系保存为Foreign Key
,而不是对象本身(@Ignore
d),因此一切都很好并且具有关系性,并且可以通过多种不同方式以及查询等方式扩展为与其他类型一起使用。
现在,问题是,如何获得一个Order
对象,其中User
对象是由其中的Room自动填充的?
如果我使用@Embedded
,则Order
和User
将位于同一张表上,这对于类型的关系分离是不利的。我可以将它们与JOIN
一起返回,但仍然只适用于具有不同名称的数据类型(也许它们都具有名为“ description”的列?),此外,还可以插入带有{ Order
里面的User
并不简单。 JOIN
仅适用于一对多,并且需要一个@Relation
,这不是我的情况。
我认为,List
可能是最好的选择,可以在@TypeConverter
和long
之间进行转换,但这很棘手。 User
将需要对@TypeConverter
的引用,以便可以查询DAO
,而User
是由Room调用的静态方法,因此传递{{1} }可能很棘手,并且会导致许多代码异味,除了对每个@TypeConverter
进行的额外查询之外,还会触发多个搜索,而这些搜索不会在同一DAO
中进行。
我是Room的新手,但我敢肯定有一种解决此问题的正确方法,可以将Room与预期要使用的关系类型一起使用,我只是无法找到如何简单,轻松地完成此工作的方法,我可以在任何文档中找到它。
答案 0 :(得分:0)
现在,问题是,如何获得一个由其中的Room自动填充的User对象的订单?
我认为对此没有现成的解决方案。
IMHO,实体模型(即,将Order
映射到FK的User.id
)不应像域/表示层一样传播到上层,提供 DataMapper
,将上层实体模型转换为域模型(即User
包含Order
)可能是一个更好的选择。