房间数据库的类型转换器不适用于具有来自另一个类的对象的类
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 是未知的 - Date
、Time
、DutyDay
。您只为Date
和Time
描述了TypeConverter,所以问题是Room 不知道如何持久化DutyDay
。
我认为你的选择是:
-
为
DutyDay
再添加一个转换器(例如,使用Gson 转换为字符串。Here 是与类似决定的链接)。
在Tour
表中使用外键而不是DutyDay
的引用。
【讨论】:
以上是关于房间数据库的类型转换器不适用于具有来自另一个类的对象的类的主要内容,如果未能解决你的问题,请参考以下文章
Forge 数据可视化不适用于 Revit 房间 [ITA]
FTS4 matchinfo 不适用于 android 房间数据库