Room 数据库的类型转换器无法在 class 上工作,它具有来自另一个 class 的对象

Type converter for Room Database not working on class which has object from another class

我有以下 class:

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

和另一个 class 使用来自 class“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 抱怨它无法弄清楚如何存储来自 class“Tour”的字段,我猜是因为它使用了在 class“DutyDay”中创建的 DutyDays。我是否必须以某种方式为“Tour”中的属性创建另一个转换器?

感谢您的帮助。

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

我认为你的选择是:

  1. DutyDay 添加一个转换器(例如,使用 Gson-converting 进行字符串处理。 是 link,具有类似的决定)。
  2. Tour table 中使用外键而不是 DutyDay 的引用。