如何使用 Room 中的嵌套关系
Posted
技术标签:
【中文标题】如何使用 Room 中的嵌套关系【英文标题】:How to work with nested relationships in Room 【发布时间】:2018-03-05 20:47:40 【问题描述】:我有实体:
@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();
问题在于 AWithB 的 @Relation,因为它不能指向实体以外的任何东西。但该实体不能包含其他实体。我应该如何从 DB 中返回整个结构?
【问题讨论】:
如果有人对答案感兴趣,请查看Answer 【参考方案1】:您似乎可以有嵌套关系(文档页面上的 Javadoc 出于某种原因没有显示整个代码,因此具有误导性)。
它正在工作:
public class AWithB
@Embedded
public A a;
@Relation(parentColumn = "id", entityColumn = "aId", entity = B.class)
public List<BWithC> bWithC;
public AWithB()
对于多对一关系,您仍然可以使用@Relation 注解。出于某种原因,您不能拥有简单的实例 - 您需要在这里收集。但它正在工作:
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()
【讨论】:
你好 Andrej,你知道如何通过 AwithB 订购吗? 我不确定你的意思。对于 A 表,您也可以使用带有Order By
语句的普通查询。要订购从@Relation 获得的实体列表,您至少现在必须在您的Java Bean (AWithB::getBWithCOrdered) 的getter 中自己完成。
这里的关键是使用 POJO 作为set
类型而不是@Relation(entity =..
,这似乎很明显,但出于某种原因,我虽然不得不这样做。如果您要像第一个示例中那样指定实体:使用注释中的实体和 POJO 作为集合/列表类型。以上是关于如何使用 Room 中的嵌套关系的主要内容,如果未能解决你的问题,请参考以下文章