我正在尝试将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>
)
}
房间数据库类是这样的。
@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;
将地图类型保存到Room数据库的方法是否错误?
答案 0 :(得分:0)
第一件事是名称似乎有误。
您要添加一个名为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)
}
}