【问题标题】:How to use Type converters for complex data type in ROOM library?如何在 ROOM 库中使用类型转换器来处理复杂数据类型?
【发布时间】:2020-02-15 15:31:00
【问题描述】:

我是 ROOM 库的新手。我有一些复杂的 json 数据结构,我想将其存储在 ROOM 数据库中,我不知道如何对多个对象列表使用类型转换。以下是我的实体,

 // Trying to put all my custom models in a single table
@Entity(tableName = "myTable")
data class RaceModelDatabase(
    @PrimaryKey
    val ID: String,
    @Embedded val info: CustomModel,
    @Embedded(prefix = "parti")
    val parti: Map<String,UserModelDatabase> ,
    @Embedded val totalTime: Map<String,TimeDataModel>
)

// 也有 Map 对象的自定义模型 数据类 CustomModel (val name :String, val crdate : String)

data class UserModelDatabase(@Embedded val info : CustomModel, 
@Embedded(prefix = "Result_")  val result :Map<String,CustomModel>
)
data class TimeDataModel (
val Start : Long,
val End : Long
)

【问题讨论】:

    标签: android-room


    【解决方案1】:

    这是一个如何将 TypeAdapter 用于您的 Map 对象的示例。其余的你也可以这样做。

    class RaceTypeConverter {
        @JvmStatic
        @TypeConverter
        fun fromString(value: String): Map<String, TimeDataModel > {
           val mapType = object : TypeToken<Map<String, TimeDataModel >>() {}.type
           return Gson().fromJson(value, mapType)
        }
    
        @TypeConverter 
        @JvmStatic
        fun fromStringMap(map: Map<String, TimeDataModel>): String {
           val gson = Gson()
           return gson.toJson(map)
        }
    }
    

    【讨论】:

    • 嗨,当我放 @JvmStatic 注释时,它给了我一个错误,说“只有命名对象和伴随对象中的成员可以用 '@jvmstatic' 注释”,搜索后我通过把它解决了伴生对象。现在,当我将类型转换器放入我的数据类时,它给了我一个错误提示“注释不适用于目标值参数”
    • @Surendar 好的。我可以知道它抱怨哪个字段“注释不适用于目标值参数”请在此处发布完整的堆栈跟踪。
    • 我刚刚注意到您对所有类型转换的字段都使用了@Embeded 注释。请删除它们并告诉我。我认为 @Embedded(prefix = "") 不适用于类型转换的字段。
    • 我试过删除“@Embeded”,cmg 仍然是同样的问题。我试过把“@typeConverter”放在数据库类本身上,还有说 TypeConverter 不适用于类型类
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多