【问题标题】:Way to save Map<String, String> to Room Database将 Map<String, String> 保存到房间数据库的方法
【发布时间】:2018-09-21 10:53:39
【问题描述】:

我正在尝试将 Map&lt;String, String&gt; 存储到 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 类是这样的。

    @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;

这是将地图类型保存到房间数据库的错误方法吗?

【问题讨论】:

  • 请为您提供 DAO 课程。可能问题是DAO类中的insert()方法没有@TypeConverters注解
  • 您应该使用@TypeConverter 表示法在声明的成员变量(即数据变量)之上定义 TypeConverter。

标签: android android-room android-architecture-components typeconverter


【解决方案1】:

首先,名称似乎有误。 您正在添加一个名为 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)
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2015-08-15
    • 2021-09-17
    相关资源
    最近更新 更多