【发布时间】:2020-10-26 20:48:50
【问题描述】:
我正在处理我的房间数据库中的一些数据集,我的方法是创建一个表,其中包含有关名为DatasetInfo 的数据集的信息,该表存储名称、存储的值类型、id 等内容;还有第二个表,我将值存储在 3 列中:(id、date、value)。这个有序的三元组被定义为DatasetValue 实体。在这里,(date, value) 是我要绘制的有序对。
要绘制这些有序对,我必须将它们转换为Entry 对象列表,其中Entry 采用值x 和y。查询我的数据库并简单地询问List<Entry> 是最有意义的,因为现在我要求List<DatasetValue>,然后我必须将该结果映射到List<Entry>,这是不必要的。
我查询数据集信息表DatasetInfo如下:
data class DatasetWithValues(
@Embedded
var datasetInfo: DatasetInfo,
@Relation(
parentColumn = DATASET_COLUMN_DATASET_ID,
entityColumn = VALUES_COLUMN_ID,
entity = DatasetValue::class,
)
var values : List<Entry>
)
现在,正如我上面所说,Entry 具有值 x 和 y,Dataset 将它们称为 date 和 value。当然,当我要求这种关系时,它会失败,因为它不知道如何将具有 id、date 和 value 列的表中的值分配给采用 x 和y。所以,我定义了一个新类:
class DatasetEntry(
@ColumnInfo(name = "date")
var date : Float,
@ColumnInfo(name = "value")
val value : Float
) : Entry(date, value)
然后进行如下调整:
//var values : List<Entry>
var values : List<DatasetEntry>
这没什么。代码无法编译,因为:
SQL 错误或缺少数据库(没有这样的列:x)
好吧,如果我改写:
class DatasetEntry(
@ColumnInfo(name = "date")
var date : Float,
@ColumnInfo(name = "value")
val value : Float
) : Entry(){
init{
x = date
y = value
}
}
这也无济于事,同样的错误。即使我删除了init 电话,它仍然需要x。
情节变厚了,因为Entry 内部我可以看到x 被声明为私有。所以我完全不知道这里发生了什么。 Room 怎么知道要找x?除了将表中的列重命名为 x 和 y 之外,还有什么解决方法吗?
【问题讨论】:
标签: kotlin android-room