1

我正在使用kotlinx.serialization从 API 和ObjectBox解析 JSON作为本地存储。

这两个库都允许构建模型或实体类。我想避免多余的类,而是更喜欢将它们组合成一个实体类。

在我不得不添加关系之前它工作得很好。

我想接受来自 API 的所有内容,这就是为什么每个字段都是@Optional. 验证是在ObjectBox实体方面进行的。

您可以在下面找到所需的代码,但该代码不起作用。

第一个问题: @Optional字段需要有一个默认值。添加后? = null(感觉很脏),我到了

问题二:解析存储后出现如下错误:

java.lang.NoSuchMethodError: No direct method (Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V in class Lkotlinx/serialization/ContextSerializer; 或其超类('kotlinx.serialization.ContextSerializer' 的声明出现在 /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk 中)

实体:苹果树

@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 
@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
      }
  }
}

任何想法?

先感谢您!

4

2 回答 2

1

我刚刚看到这个解决方案并写了一篇关于如何在不映射实体的情况下简单地做到这一点的文章。

我希望这可能对您有所帮助-> https://medium.com/@ryan.shaw_80293/android-local-database-tricks-with-kotlin-and-objectbox-f0da58c9d5a3

于 2019-03-09T22:43:21.740 回答
1

我找不到没有冲突的组合解决方案,所以我决定拆分模型:

  1. Retrofit 2 的每个 API 调用
  2. 每个 ObjectBox 实体的模型

从 Retrofit 获取数据后,我创建了 ObjectBox 实体。有点多余的冗余,但它的工作原理。:-)

于 2018-05-28T12:41:45.207 回答