android - 如何在 Room 中处理嵌套关系

标签 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();

问题出在 AWithB 的 @Relation 上,因为它只能指向实体。但该实体不能包括其他实体。我应该如何从数据库中返回整个结构?

最佳答案

看起来你可以有嵌套关系(文档页面上的 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() {}
}

关于android - 如何在 Room 中处理嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46395775/

相关文章:

Android:如何实现长按列表项时的发光效果?

android - 为什么项目可以在没有工厂的情况下创建带有构造函数参数的ViewModel类的实例

android - 如何从 onStartCommand 获取上下文

python - 从字符串中解析日期并使用 Sqlalchemy tosqlite 插入

mysql - 如何追踪一个人去某个地方的时间?

android - 安装 react-native-iap 后 React Native 应用无法运行

sqlite - 构建库 dart_sqlite 时找不到 dart_api.h

android - 未创建 SQlite 表,但在 Android 中创建了数据库

php - 蛋糕 php 包含在包含