在房间中,如何在 POJO 中指定父实体关系



在Androidx Room中,如何检索POJO中的所有实体关系?

我有以下数据库结构,其中 A 是 B 的父级,B 是 C 的父级:

@Entity(tableName="a")
class A(){
  @PrimaryKey
  var id: Long = 0L,
  var name: String = ""
}
@Entity(tableName= "b",
        foreignKeys = arrayOf(
            ForeignKey(
                entity = A::class,
                parentColumns = arrayOf("id"),
                childColumns = arrayOf("a_id"),
                onDelete = ForeignKey.CASCADE
                ))
)
class B() {
  @PrimaryKey(autoGenerate = true)
  var id: Long = 0L,
  @ColumnInfo(name="a_id")
  var aId: Long = 0L,
  var name: String = ""
)
@Entity(tableName= "c",
        foreignKeys = arrayOf(
            ForeignKey(
                entity = B::class,
                parentColumns = arrayOf("id"),
                childColumns = arrayOf("b_id"),
                onDelete = ForeignKey.CASCADE
                ))
)
data class C (
    @PrimaryKey(autoGenerate = true)
    var id: Long = 0L,
    @ColumnInfo(name ="b_id")
    var bId: Long = 0L,
    var name: String = ""
)

我想写一个应该包含 B 及其所有 C 及其父 A 的 POJO:

class BAndAllCs {
   @Embedded
   var b: B? = null
   @Relation(parentColumn = "id",
             entityColumn = "b_id",
             entity= C::class)
   var c_all: List<C> = ArrayList()
   //how to retrieve parent A of B? 
}

因此,在BDao中,我可以添加以下内容:

@Transaction
@Query("SELECT * FROM B")
List<BAndAllCs> getAllB();

是否可以嵌入"b"的父"a"?有没有办法习惯性地编写这种用法?对此有什么建议的最佳实践吗?

无需嵌入父 A 对象,只需使用 Dao 中的内部连接将 A 中的相关字段获取到 POJO 中即可。

道:

@Transaction
@Query("SELECT B.*, A.name as a_name FROM B inner join A on b.a_id = a.id")
List<BAndAllCs> getAllB();

波乔:

class BAndAllCs {
   @Embedded
   var b: B? = null
   @ColumnInfo("a_name")
   var aName: String = ""
   @Relation(parentColumn = "id",
             entityColumn = "b_id",
             entity= C::class)
   var c_all: List<C> = ArrayList()
}

最新更新