如何处理房间中嵌套的一对一对象中的关系数据(将ForeignKey转换为对象)

时间:2018-08-22 00:32:39

标签: android android-room android-architecture-components android-jetpack

假设我有一个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,则OrderUser将位于同一张表上,这对于类型的关系分离是不利的。我可以将它们与JOIN一起返回,但仍然只适用于具有不同名称的数据类型(也许它们都具有名为“ description”的列?),此外,还可以插入带有{ Order里面的User并不简单。 JOIN仅适用于一对多,并且需要一个@Relation,这不是我的情况。

我认为,List可能是最好的选择,可以在@TypeConverterlong之间进行转换,但这很棘手。 User将需要对@TypeConverter的引用,以便可以查询DAO,而User是由Room调用的静态方法,因此传递{{1} }可能很棘手,并且会导致许多代码异味,除了对每个@TypeConverter进行的额外查询之外,还会触发多个搜索,而这些搜索不会在同一DAO中进行。

我是Room的新手,但我敢肯定有一种解决此问题的正确方法,可以将Room与预期要使用的关系类型一起使用,我只是无法找到如何简单,轻松地完成此工作的方法,我可以在任何文档中找到它。

1 个答案:

答案 0 :(得分:0)

  

现在,问题是,如何获得一个由其中的Room自动填充的User对象的订单?

我认为对此没有现成的解决方案。

IMHO,实体模型(即,将Order映射到FK的User.id不应像域/表示层一样传播到上层,提供 DataMapper ,将上层实体模型转换为域模型(即User包含Order)可能是一个更好的选择。