首页 > 解决方案 > 如何在 TypeConverter 中使用 Gson 将 Kotlin Enum 与 Room 一起存储?

问题描述

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

我的实体类:

@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 枚举类:

enum class HighlightingColor(

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

    @SerializedName("title")
    var title: String

)

我的类型转换器

class HighlightingColorConverter {

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

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

}

无法理解出了什么问题。请帮忙解决!

标签: androidkotlinenumsgsontypeconverter

解决方案


一段时间后,我想出了如何解决它。

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

最终代码是:

@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)

        }

    }

}

推荐阅读