如何在 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)
}
不明白哪里出了问题。请大家帮忙解答一下!
过了一段时间我想出了如何修复它。
- TypeConverter 函数应放在
companion object
中并具有 @JvmStatic
注释。这听起来合乎逻辑,因为这些函数在 java. 中应该是静态的
@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)
}
}
}
我在尝试将 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)
}
不明白哪里出了问题。请大家帮忙解答一下!
过了一段时间我想出了如何修复它。
- TypeConverter 函数应放在
companion object
中并具有@JvmStatic
注释。这听起来合乎逻辑,因为这些函数在 java. 中应该是静态的
@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)
}
}
}