android - 如何在 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)
}
无法理解出了什么问题。请帮忙解决!
解决方案
一段时间后,我想出了如何解决它。
- 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)
}
}
}
推荐阅读
- javascript - 使用调度程序 Firebase 云功能检索 IP 地址并存储在 Firestore 中
- android - 将Uri作为位图放置在imageView中的操作发生错误
- javascript - Firebase 获取具有特定输入字符串的所有文档
- python - 出现错误:“int”对象没有属性“isnumeric”
- apache-nifi - 如何使用 QueryRecord 处理数组?
- python - 如果在 try 块中找不到一个不同的 XPATH,如何尝试不同的 XPATH,Selenium Python
- python - 如果在 cmd 中运行,这可能在 python 中吗?
- javascript - 不能使用 React 上下文?
- junit - 使用 Mockito/powermock 模拟静态方法对象
- sql - 在 SQLite 中仅使用 SQL 更新和记录更改的行