房间数据库的类型转换器不适用于具有来自另一个类的对象的类

Posted

技术标签:

【中文标题】房间数据库的类型转换器不适用于具有来自另一个类的对象的类【英文标题】:Type converter for Room Database not working on class which has object from another class 【发布时间】:2021-01-19 09:10:33 【问题描述】:

我有以下课程:

@Entity(tableName = "dutyday_table")
data class DutyDay(
@PrimaryKey
val date: Date,
val showTime: Time,
val  closingTime:Time
)

以及另一个使用“DutyDay”类对象的类:

@Entity(tableName = "tour_table")
data class Tour(
@PrimaryKey
val day1: DutyDay?,
val day2: DutyDay?,
val day3: DutyDay?,
val day4: DutyDay?,
val day5: DutyDay?,
val day6: DutyDay?,
val day7: DutyDay?,
val totalHours: Time
)

以及以下转换器:

class Converters 
@TypeConverter
fun longToDate(value: Long?): Date? 
    return value?.let  Date(it) 


@TypeConverter
fun dateToLong(date: Date?): Long? 
    return date?.time


@TypeConverter
fun longToTime(value: Long?): Time? 
    return value?.let  Time(it) 


@TypeConverter
fun timeToLong(date: Time?): Long? 
    return date?.time


转换器已在数据库中正确注释,我已经使用了 Room Database 和转换器,然后它们才能正常工作。但是对于这个例子,android Studio 抱怨它无法弄清楚如何存储“Tour”类中的字段,我猜是因为它使用了“DutyDay”类中创建的 DutyDays。我是否必须以某种方式为“Tour”中的属性创建另一个转换器?

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您的实体中有 3 个对象对于 Room 是未知的 - DateTimeDutyDay。您只为DateTime 描述了TypeConverter,所以问题是Room 不知道如何持久化DutyDay

我认为你的选择是:

    DutyDay 再添加一个转换器(例如,使用Gson 转换为字符串。Here 是与类似决定的链接)。 在Tour 表中使用外键而不是DutyDay 的引用。

【讨论】:

以上是关于房间数据库的类型转换器不适用于具有来自另一个类的对象的类的主要内容,如果未能解决你的问题,请参考以下文章

Forge 数据可视化不适用于 Revit 房间 [ITA]

FTS4 matchinfo 不适用于 android 房间数据库

Typeahead JS 不适用于具有相同类的多个输入

转换函数不适用于 CLOB 数据类型

SwiftUI 中的 Picker 适用于 ForEach 的一个版本,但不适用于另一个版本 - 错误或预期行为?

Android 房间 DAO 接口不适用于继承