我在尝试将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)
}
无法理解是怎么回事。请帮忙弄清楚!
最佳答案
一段时间后,我想出了解决方法。
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)
}
}
}