Как сохранить Kotlin Enum with Room с помощью Gson в TypeConverter? - PullRequest
1 голос
/ 21 января 2020

Я столкнулся с проблемами при попытке сохранить Kotlin Enum with 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

)

My TypeConverter :

class HighlightingColorConverter {

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

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

}

Не могу понять, что не так. Пожалуйста, помогите разобраться!

1 Ответ

0 голосов
/ 21 января 2020

Через некоторое время я понял, как это исправить.

  1. Функции TypeConverter должны быть помещены в companion object и иметь аннотацию @JvmStatic. Это звучит логично, потому что эти функции должны быть помещены c в 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)

        }

    }

}
...