我正在尝试存储 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/