android - 将 Map<String, String> 保存到房间数据库的方法

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

我正在尝试存储 Map<String, String>到房间数据库。

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

房间数据库类就像。

    @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 数据库的方法是错误的吗?

最佳答案

首先是名字似乎有误。 您要添加一个名为 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)
    }
}

关于android - 将 Map<String, String> 保存到房间数据库的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52442178/

相关文章:

android - 在任何设备上使用谷歌地图。 (没有谷歌播放)

android - 单个 ViewModel 中的多个 LiveData 对象

android - 如何使用 livedata 进行数据绑定(bind)?

android - 当回收器 View 放置在 nestedscrollview 中时,PagedListAdapter 获取所有项目

android - 在 Linux 上为 Android 设置 Marble 时无法使用 CMake 配置

android - 用于自定义 android editText 的库,每个字母都有单独的框(例如 otp/pin View ),间距可变以容纳多个单词

android - 以编程方式设置 LinearLayout 的 layout_below 和 weightsum

android - 主键不是增加房间android

android - LiveData_LifecycleBoundObserver_LifecycleAdapter 无法转换为 GeneratedAdapter

android - 将参数传递给嵌套的导航架构组件图