【问题标题】:How to work with nested relationships in Room如何使用 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

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


【解决方案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 作为集合/列表类型。
猜你喜欢
  • 2018-02-18
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多