Номер.Как хранить динамические поля в базе данных? - PullRequest
0 голосов
/ 08 февраля 2019

Сервер может вернуть строку или массив строк в результате того же запроса.Это не может быть изменено.Пример: {"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.Я не уверен, что вы можете сделать это вообще, и есть ли выход из этой ситуации ... Кто-нибудь знает, что я должен делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...