Способ сохранить картув комнату базы данных - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь сохранить Map<String, String> в базе данных комнат.

Json как ниже.

{
  "version": 1,
  "data": {
    "en": {"name": "english"},
    "ko": {"name": "korean"},
    "de": {"name": "germany"}
  }
}

Entity как ниже.

@Entity
data class Translation(

        @PrimaryKey(autoGenerate = true)
        val version: Int,

        @SerializedName("data")
        @Embedded
        val data: Data
) {

    data class Data(
            @SerializedName("en")
            val english: Map<String, String>,

            @SerializedName("ko")
            val korean: Map<String, String>,

            @SerializedName("de")
            val german: Map<String, String>
    )
}

Номер класса базы данных похож на.

    @Database(
            entities = [
                Translation::class
            ],
            version = 1,
            exportSchema = false
    )
    @TypeConverters(ClassTypeConverter::class)
    abstract class AppDatabase : RoomDatabase() {

        abstract fun translationDao(): TranslationDao
    }

Atнаконец, ClassTypeConvert находится ниже.

object MapTypeConverter {

    @TypeConverter
    fun stringToMap(value: JsonElement): Map<String, String> {
        return Gson().fromJson(value,  object : TypeToken<Map<String, String>>() {}.type)
    }

    @TypeConverter
    fun mapToString(value: Map<String, String>?): String {
        return if(value == null) "" else Gson().toJson(value)
    }
}

Но показывает ошибку,

Cannot figure out how to save this field into database. You can consider adding a type converter for it.
        private final java.util.Map<java.lang.String, java.lang.String> english = null;

Это неправильный способ сохранения типа карты в базе данных комнаты?

1 Ответ

0 голосов
/ 29 июля 2019

Во-первых, кажется, что с именами произошла ошибка.Вы добавляете конвертер типов с именем ClassTypeConverter

@TypeConverters(ClassTypeConverter::class)
abstract class AppDatabase : RoomDatabase() {...}

, однако, у конвертера, у которого, как вы говорите, есть проблемы, он называется MapTypeConverter

object MapTypeConverter {...}

Я полагаю, вы хотите, чтобы они были такими же


Кроме того, когда вы пишете kotlin, вы должны использовать аннотацию @JvmStatic в методах преобразователя типов, так как ожидается использование статических методов

object MapTypeConverter {

    @TypeConverter
    @JvmStatic
    fun stringToMap(value: JsonElement): Map<String, String> {
        return Gson().fromJson(value,  object : TypeToken<Map<String, String>>() {}.type)
    }

    @TypeConverter
    @JvmStatic
    fun mapToString(value: Map<String, String>?): String {
        return if(value == null) "" else Gson().toJson(value)
    }
}
...