首页 > 解决方案 > Android Room - 类型转换器在实体字段范围内不起作用

问题描述

我试图将类型转换器添加到我的实体,但我发现它仅适用于数据库、dao 和实体范围,而不适用于实体字段范围。

例如:当我像这样在实体范围中添加类型转换器时,它工作正常。

@Entity(tableName = "chat_history")
@TypeConverters(ChatEntityConverter::class)
class ChatHistoryEntity (
    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "history_id") val HID: Long?,
    @ColumnInfo(name = "history_name") var pairedName: String?,
    @ColumnInfo(name = "history_last_message") var lastMessage: String?,
    @ColumnInfo(name = "history_last_date")
    var lastDate: Date?
)

但是如果我将它移到实体字段范围内,它就无法编译。

@Entity(tableName = "chat_history")
class ChatHistoryEntity (
    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "history_id") val HID: Long?,
    @ColumnInfo(name = "history_name") var pairedName: String?,
    @ColumnInfo(name = "history_last_message") var lastMessage: String?,
    @TypeConverters(ChatEntityConverter::class)
    @ColumnInfo(name = "history_last_date")
    var lastDate: Date?
)

它显示如下错误消息:

error: Cannot figure out how to save this field into database.

我的转换器是:

class ChatEntityConverter {
    @TypeConverter
    fun fromTimeStamp(date: Long?): Date? {
        return when(date) {
            null -> null
            else -> Date(date)
        }
    }

    @TypeConverter
    fun dateToTimeStamp(date: Date?): Long? {
        return when(date) {
            null -> null
            else -> date.time
        }
    }
}

由于它还将长类型转换为日期类型,我不希望它在实体范围内工作。仅在日期类型字段范围内。但我就是不能把它放在那里并编译它。

标签: androidkotlinandroid-room

解决方案


@TypeConverters在一个领域工作。您正在使用 Kotlin,因此您可以更直接地使用属性。要将注释应用于支持字段,请使用@field:TypeConverters而不是@TypeConverters.


推荐阅读