Kotlin: объединенный класс сущностей ObjectBox и kotlinx. Сериализация в конфликте? - PullRequest
0 голосов
/ 16 мая 2018

Я использую 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
      }
  }
}

Любойидея?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Я только что увидел это решение и написал статью о том, как сделать это просто без сопоставления сущностей.

Надеюсь, это поможет вам -> https://medium.com/@ryan.shaw_80293/android-local-database-tricks-with-kotlin-and-objectbox-f0da58c9d5a3

0 голосов
/ 28 мая 2018

Я не смог найти комбинированное решение без конфликтов, поэтому решил разделить модели:

  1. Каждый вызов API для модернизации 2
  2. Модель для каждого объекта ObjectBox

Я создаю объекты ObjectBox после извлечения данных из Retrofit. Слишком много избыточности, но это работает. : -)

...