如何使用Room中的嵌套关​​系

时间:2017-09-24 23:24:29

标签: android sqlite database-relations android-room android-architecture-components

我有实体:

@Entity
public class A {
    @PrimaryKey(autoGenerate = true)
    public long id;
    public A() {}
}

@Entity()
public class B {
    @PrimaryKey @NonNull
    public String id;
    public String oneCId;
    public String anotherCId;
    public long aId;
    public B() {}
}

@Entity
public class C {
    @PrimaryKey @NonNull
    public String id;
    public String value;
    public C() {}
}

和一些POJO:

public class AWithB {
    @Embedded
    public A a;

    @Relation(parentColumn = "id", entityColumn = "aId")
    public List<BWithC> bWithC;

    public AWithB() {}
}

public class BWithC {
    @Embedded
    public B b;
    public C oneC;
    public C anotherC;

    public BWithC() {}
}

与DAO:

@Query("SELECT * FROM a")
List<AWithB> getAllNow();

问题出在AWEIB的@Relation上,因为它不能指向除实体之外的任何东西。但该实体不能包含其他实体。我该如何从DB返回整个结构?

1 个答案:

答案 0 :(得分:8)

您似乎可以拥有嵌套关系(文档页面上的Javadoc由于某种原因没有显示整个代码,并因此而误导)。

它正在运作:

public class BWithC {
    @Embedded
    public B b;
    @Relation(parentColumn = "oneCId", entityColumn = "id")
    public Set<C> oneC;
    @Relation(parentColumn = "anotherCId", entityColumn = "id")
    public Set<C> anotherC;

    public BWithC() {}
}

对于关系多对一,你仍然可以使用@Relation注释。出于某种原因,你不能拥有简单的实例 - 你需要一个集合。但它正在发挥作用:

post_impressions