Как сохранить массив в базу данных android.room?
У меня есть дата-класс, который необходимо сохранить в базе данных room'а:
@Entity(tableName = "day_data_table")
data class Day(var subjcts : Iterable<Subject>, var dayOfMonth : String) {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "day_date")
var Date : String = dayOfMonth
private set
@ColumnInfo(name = "date_subjects")
var Subjects : Iterable<Subject> = subjcts
private set
}
Проблема в том, что мне нужно сохранить массив с неопределенным заранее количеством элементов, как я могу это сделать?
Ответы (1 шт):
Простейшее решение это сериализация массива в строку и обратно в массив. Так можно делать если вы не собираетесь менять эти данные, например добавлять или удалять элементы. Для этого создается TypeConverter в удобном вам месте. Вот пример класса, который вы сможете расширять в дальнейшем.
Только замените Iterable на List или другую реализацию.
class TypeConverter {
private val gson = Gson()
@TypeConverter
fun subjctsToJson(subjcts: List<Subject>?): String? {
return if (subjcts == null || subjcts.isEmpty()) {
null
} else {
gson.toJson(subjcts)
}
}
@TypeConverter
fun jsonToSubject(json: String?): List<Subject> {
return if (json.isNullOrEmpty()) {
listOf()
} else {
val type = object : TypeToken<List<Subject>>() {}.type
gson.fromJson(json, type)
}
}
Заметьте, что вам не нужно ничего вызывать room сам найден аннотации @TypeConverter.
Теперь всегда, когда получаете "Cannot figure out how to save this field into database", вы можете прибегнуть к подобному решению.