Я использую kotlinx.serialization для анализа JSON из API и ObjectBox в качестве локального хранилища.
Обе библиотеки позволяют структурировать модель или классы сущностей.Я хотел бы избежать избыточных классов и предпочесть объединить их в один класс сущностей каждый.
Это работало нормально, пока мне не пришлось добавить отношений .
Я бынравится принимать все из API, поэтому каждое поле @Optional
.Проверка выполняется на ObjectBox
части сущности.
Ниже вы можете найти нужный код, который не работает.
1-я проблема: @Optional
поля должны иметь значение по умолчанию.После добавления ? = null
(который казался грязным) я попал в
2-ю проблему: после анализа и сохранения появляется следующая ошибка:
java.lang.NoSuchMethodError: Прямой метод отсутствует (Lkotlin / refle / KClass; Lkotlinx / serialization / KSerializer;) V в классе Lkotlinx / serialization / ContextSerializer;или его суперклассы (объявление 'kotlinx.serialization.ContextSerializer' появляется в /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk)
Entity:AppleTree
@Entity // ObjectBox
@Serializable // Serializable
data class AppleTree(
@Optional // Serializable
@Id(assignable=true) // ObjectBox
var id: Long = 0,
@Optional // Serializable
@Backlink // ObjectBox
var apples: ToMany<Apple>
)
Entity: Apple
@Entity
@Serializable
data class Apple(
@Optional // Serializable
@Id(assignable=true) // ObjectBox
var id: Long = 0,
@Optional // Serializable
var tree: ToOne<AppleTree>
)
Получить и сохранить
private fun fetch() {
doAsync {
var json = mapKeys(URL(myURL).readText()) // fetch JSON from API
uiThread {
val appleTree = JSON.nonstrict.parse<AppleTree>(json) // parse JSON
val appleTreeBox = (application as App).getAppleTreeBox() // get ObjectBox
appleTreeBox.put(appleTree) // save
}
}
}
Любойидея?
Заранее спасибо!