【发布时间】:2021-06-22 16:34:00
【问题描述】:
假设我的 RoomDB 有以下实体:
enum class Type {
FOO,
BAR
}
@Entity(
tableName = "amount",
primaryKeys = ["id", "type"]
)
data class Amount(
val id: Long,
val type: Type,
val amount: Int
)
@Entity(
tableName = "value",
primaryKeys = ["id", "valueType"]
)
data class Value(
val id: Long,
val valueType: Type,
val value: Int
)
我想做的是以某种方式,使用 SQL 查询(或 RoomDB 注释,理想情况下......)查询 amount 表,并将每个金额与 value 表中的相应值行连接起来(使用来自amount 的type 交叉引用value 表上的valueType 字段),方法是将amount 字段与value 字段相乘,最终得到如下对象:
data class ValueOfAmount(
val type: Type,
val valueOfAmount: Int // amount * value
)
我可以想到一种方法来做到这一点,但它需要在我的 repo 代码层中执行一些 JOIN “逻辑”,而我更愿意在查询层执行此操作(如果可能的话)。
像这样创建一个连接的数据类:
data class AmountWithValue(
@Embedded
val amount: Amount,
@Relation(
parentColumn = "type",
entityColumn = "valueType"
)
val value: Value
)
从我的 dao 中公开一个函数来检索连接的数据:
@Query("SELECT * from amount")
suspend fun getAmountsWithValues() : List<AmountWithValue>
使用此函数,并将结果映射到ValueOfAmount 实例,如下所示:
val valueOfAmounts = dao.getAmountsWithValues().map { amountWithValue ->
ValueOfAmount(
amountWithValue.amount.type,
amountWithValue.amount.amount * amountWithValue.value.value
)
}
// Do stuff with value of amounts
我想知道的是,是否有某种方法可以将该映射代码编码到 QUERY 本身(通过 SQL,或者,如果 RoomDB 有一些支持这种复杂查询的注释作为我的数据类型 - 类似于让我为简单的 JOIN 操作定义关系)。
【问题讨论】:
标签: android sql android-room