首页 > 解决方案 > 如何将 Room TypeConverter 应用于实体的单个字段?

问题描述

我一直在尝试将 aTypeConverter应用于 Room 数据库实体的单个字段的不同解决方案,但出现错误

Cannot figure out how to save this field into database. You can consider adding a type converter for it.

当我将转换器应用于这样的实体时:

@Entity(tableName = DBKey.calendarDayTable)
@TypeConverters(DateStringConverter::class)
data class CalendarDay(

    @PrimaryKey
    val date: Date
)

一切都按预期工作,但是当我将它应用到这样的领域时:

@Entity(tableName = DBKey.calendarDayTable)
data class CalendarDay(

    @PrimaryKey
    @TypeConverters(DateStringConverter::class)
    val date: Date
)

我收到上面提到的错误。

DateStringConverter课程是:

class DateStringConverter {
    private val formatter = SimpleDateFormat("yyyy-MM-dd")

    @TypeConverter
    fun dateFromString(value: String): Date {
        return formatter.parse(value)!!
    }

    @TypeConverter
    fun dateToString(date: Date): String {
        return formatter.format(date)
    }
}

我正在使用 Room 版本2.2.5并在 Kotlin 中编写应用程序。Room 的依赖项是:

implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
implementation "androidx.room:room-ktx:$room_version"

有没有一种方法可以DateStringConverter仅应用于实体的date字段CalendarDay,还是必须将其应用于整个实体?

标签: androidkotlinandroid-room

解决方案


您必须指定应将注释应用于该字段

@field:TypeConverters(DateStringConverter::class)
val date: Date

如果您不指定使用站点目标,则根据正在使用的注释的@Target 注释选择目标。如果有多个适用目标,则使用以下列表中的第一个适用目标:

  • 参数(构造函数参数);
  • 财产;
  • 场地。

https://kotlinlang.org/docs/reference/annotations.html#annotation-use-site-targets


推荐阅读