我在尝试将Room的 Kotlin枚举保存为JSON(使用Gson)时遇到问题。我已经完全遵循official Google instruction并添加了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

)

我的 TypeConverter :
class HighlightingColorConverter {

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

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

}

无法理解是怎么回事。请帮忙弄清楚!

最佳答案

一段时间后,我想出了解决方法。

  • TypeConverter函数应放在companion object中,并具有@JvmStatic批注。这听起来合乎逻辑,因为这些函数在Java中应该是静态的。
  • @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)
    
            }
    
        }
    
    }
    

    09-28 05:16