房间。如何在数据库中存储动态字段?

时间:2019-02-08 08:55:42

标签: android database kotlin

由于相同的请求,服务器可能返回一个字符串或字符串数​​组。这是无法更改的。 例:     {       “值”:“值”     }     {       “值”:[         “ val1”,         “ val2”          ]     } 我知道可以编写用于翻新的TypeAdapter,然后可以获取此数据。 但是我不明白如何将此类数据保存在数据库“ Room”中。

我正在尝试执行以下操作: 我创建了一个包含一些字段的界面。 可以是String或String []的字段的类型为Any(kotlin)。然后,我创建了2个实现此接口的类。在一个类中,此字段的类型为String,在另一类中,此类型为String []。 然后,我创建了一个TypeConverter,并进行了注册。

实体需要保存在数据库中

@Entity(tableName = "surveys_table")
data class Survey(
    ...
    @SerializedName("questions")
    private var questions: List<Question>
)

可以包含字符串或字符串数​​组的接口

interface Question {
    ...
    var value: Any
}

2个实现此接口的类

data class QuestionWithArrayValues(
    ...,
    val _value: List<String>?

) : Question


data class QuestionWithStringValues(

    ...,
    val _value: String?

) : Question

对象转换器

class QuestionsConverter{

@TypeConverter
fun fromQuestionsDbList(questions: List<Question>?): String? {
    if (questions == null) {
        return null
    }
    val gson = Gson()
    return try {
        val type = object : TypeToken<List<QuestionWithStringValues>>() { }.type
        gson.toJson(questions, type)
    } catch (exception: Exception) {
        val type = object : TypeToken<List<QuestionWithArrayValues>>() { }.type
        gson.toJson(questions, type)
    }
}

@TypeConverter
fun toQuestionsDbList(questions: String?): List<Question>? {
    if (questions == null) {
        return null
    }
    val gson = Gson()
    return try {
        val type = object : TypeToken<List<QuestionWithStringValues>>() {}.type
        gson.fromJson<List<QuestionWithStringValues>>(questions, type)
    } catch (exception: Exception) {
        val type = object : TypeToken<List<QuestionWithArrayValues>>() {}.type
        gson.fromJson<List<QuestionWithArrayValues>>(questions, type)
    }
}
}

寄存器转换器

@TypeConverters(QuestionsConverter::class)
abstract class AppDatabase : RoomDatabase() ...

但我不断收到错误消息:

  

无法弄清楚如何将该字段保存到数据库中。你可以考虑   为此添加一个转换器。

我还尝试使用抽象类而不是Question接口。我不确定您完全可以做到这一点,并且有什么办法可以避免这种情况... 有谁知道我该怎么办?

0 个答案:

没有答案