在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()
}