如何在TypeConverter中使用Gson存储Kotlin Enum with Room?



我在尝试将Kotlin Enum 与 Room 保存为 JSON 时遇到了问题(使用 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)
}

不明白怎么了。请帮忙弄清楚!

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

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

最新更新