如何在 TypeConverter 中使用 Gson 将 Kotlin Enum 与 Room 一起存储?

How to store Kotlin Enum with Room using Gson in TypeConverter?

我在尝试将 Kotlin Enum with Room 保存为 JSON(使用 Gson) 时遇到问题。我已经完全按照 official Google instruction 并添加了 TypeConverter,但它一直报错:无法弄清楚如何将此字段保存到数据库中。可以考虑为其添加类型转换器

我的实体class:

@Entity(tableName = TextHighlight.TABLE_NAME)
data class TextHighlight.TABLE_NAME(

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = COLUMN_ID)
    var id: Long = 0,

    @TypeConverters(HighlightingColorConverter::class)
    @ColumnInfo(name = COLUMN_HIGHLIGHT)
    var color: HighlightingColor

) {

我的 Kotlin 枚举 class:

enum class HighlightingColor(

    @SerializedName("rgb")
    var rgb: String,

    @SerializedName("title")
    var title: String

)

我的TypeConverter:

class HighlightingColorConverter {

    @TypeConverter
    fun fromHighlightingColor(highlight: HighlightingColor) = Gson().toJson(highlight)

    @TypeConverter
    fun toHighlightingColor(s: String): HighlightingColor =
        Gson().fromJson(s, HighlightingColor::class.java)

}

不明白哪里出了问题。请大家帮忙解答一下!

过了一段时间我想出了如何修复它。

  1. TypeConverter 函数应放在 companion object 中并具有 @JvmStatic 注释。这听起来合乎逻辑,因为这些函数在 java.
  2. 中应该是静态的
  3. @TypeConverters 注释不应放在实体字段上方,而应放在孔实体数据上方 class.

最终代码为:

@TypeConverters(TextHighlight.HighlightingColorConverter::class)
@Entity(tableName = TextHighlight.TABLE_NAME)
data class TextHighlight(

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = COLUMN_ID)
    var id: Long = 0,

    @ColumnInfo(name = COLUMN_HIGHLIGHT)
    var color: HighlightingColor

) {

    class HighlightingColorConverter {

        companion object {

            @JvmStatic
            @TypeConverter
            fun fromHighlightingColor(highlight: HighlightingColor) = Gson().toJson(highlight)

            @JvmStatic
            @TypeConverter
            fun toHighlightingColor(s: String): HighlightingColor =
                Gson().fromJson(s, HighlightingColor::class.java)

        }

    }

}