由于相同的请求,服务器可能返回一个字符串或字符串数组。这是无法更改的。 例: { “值”:“值” } { “值”:[ “ 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
接口。我不确定您完全可以做到这一点,并且有什么办法可以避免这种情况...
有谁知道我该怎么办?