Android ROOM 保存 Map<String, Object>

Dav*_*aja 5 android kotlin android-room

我有一个这样的模型

\n\n
@Entity(tableName = "allrates")\nclass Data(\n        @ColumnInfo(name = "rates")\n        @SerializedName("rates")\n        @Expose\n        var rates: Map<String, Rates>,\n\n        @ColumnInfo(name = "start")\n        @SerializedName("start_at")\n        @Expose\n        var startDate: String,\n\n        @ColumnInfo(name = "end")\n        @SerializedName("end_at")\n        @Expose\n        var endDate: String,\n\n        @SerializedName("base")\n        @Expose\n        var base: String,\n\n        @PrimaryKey(autoGenerate = true)\n        var id: Int  \n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的问题是,当我尝试插入数据库时​​,没有显示任何错误,但是当我执行 \xc2\xb4get\xc2\xb4 时,总是返回 null。所以可能,我的问题出在 \xc2\xb4Converter\xc2\xb4 中,但我不确定。

\n\n

这是我的转换器

\n\n
class mapConverter {\n    @TypeConverter\n    fun fromString(value: String): Map<String, Rates> {\n        val mapType = object : TypeToken<Map<String, Rates>>() {\n\n        }.type\n        return Gson().fromJson(value, mapType)\n    }\n\n    @TypeConverter\n    fun fromStringMap(map: Map<String, Rates>): String {\n        val gson = Gson()\n        return gson.toJson(map)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

DAO 就这样出现了

\n\n
@Dao\nabstract class RatesDao {\n\n    @Query("SELECT * FROM allrates")\n    abstract fun loadRates(): LiveData<Data>\n\n    @Insert(onConflict = OnConflictStrategy.REPLACE)\n    abstract fun insertRates(rates: Data)\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

与 ROOM 的连接

\n\n
@Database(entities = [(Data::class)], version = 1, exportSchema = false)\n@TypeConverters(mapConverter::class)\nabstract class AppDatabase : RoomDatabase() {\n\n    companion object {\n        private var sInstance: AppDatabase? = null\n        private const val DATABASE_NAME: String = "RatesList"\n\n        fun getInstance(context: Context): AppDatabase {\n            if (sInstance == null) {\n                synchronized(AppDatabase::class) {\n                    sInstance = Room.databaseBuilder(context.applicationContext,\n                            AppDatabase::class.java, DATABASE_NAME)\n                            .build()\n                }\n            }\n            return sInstance as AppDatabase\n        }\n    }\n\n    abstract fun ratesDao(): RatesDao\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Iva*_*ovk 1

您正在用 Kotlin 编写代码,因此请将此行@JvmStatic添加到 MapConverter 类,如下所示:

class  MapConverter {
    companion object{
        @JvmStatic
        @TypeConverter
        fun fromString(value: String): Map<String, String> {
            val mapType = object : TypeToken<Map<String, String>>() {}.type
            return Gson().fromJson(value, mapType)
        }
        @TypeConverter
        @JvmStatic
        fun fromStringMap(map: Map<String, String>): String {
            val gson = Gson()
            return gson.toJson(map)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)