将Map<String, String>保存到Room数据库的方法

8

我正在尝试将 Map<String, String> 存储到 Room 数据库中。

Json 如下所示。

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

实体如下所示。

@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>
    )
}

Room数据库类就像这样。

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

        abstract fun translationDao(): TranslationDao
    }

最后,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;

将Map类型保存到Room数据库的方式是否有误?


请提供您的DAO类。也许问题在于DAO类中的insert()方法没有@TypeConverters注释。 - MrVasilev
你应该使用@TypeConverter注释在已声明的成员变量,即数据变量的顶部定义TypeConverter。 - maveroid
1个回答

14

首先,似乎名称有误。您正在添加一个名为ClassTypeConverter的类型转换器。

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

然而你所说有问题的转换器叫做MapTypeConverter

object MapTypeConverter {...}

我相信你的意图是想让它们相同


另外,由于你在写Kotlin代码,你需要在类型转换方法上使用@JvmStatic注释,因为Room需要静态方法。

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)
    }
}

stringToMap 应该接受一个字符串作为参数,而不是 JsonElement。 - Mohamed Nageh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接