Сервер может вернуть строку или массив строк в результате того же запроса.Это не может быть изменено.Пример: {"value": "val"} {"value": ["val1", "val2"]} Я знаю, что могу написать TypeAdapter для Retrofit, а затем получить эти данные.Но я не могу понять, как я сохраняю такие данные в базе данных «Комната».
Я пытаюсь сделать следующее: Я создал интерфейс с некоторыми полями.Поле, которое может быть 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
.Я не уверен, что вы можете сделать это вообще, и есть ли выход из этой ситуации ... Кто-нибудь знает, что я должен делать?