Kotlin:ObjectBox 的合并实体 class 和 kotlinx.Serialization 有冲突吗?
Kotlin: combined Entity class of ObjectBox and kotlinx.Serialization in conflict?
我正在使用 kotlinx.serialization to parse JSON from an API and ObjectBox 作为本地存储。
两个库都允许构建模型或实体 classes。我想避免冗余的 classes 并且更愿意将它们组合成一个实体 class 每个。
它工作正常,直到我不得不添加 relations。
我愿意接受 API 中的所有内容,这就是为什么每个字段都是 @Optional
的原因。验证是在实体的 ObjectBox
部分进行的。
您可以在下面找到所需的代码,但该代码不起作用。
第一个问题: @Optional
字段需要有默认值。添加 ? = null
(感觉很脏)后,我得到了
第二个问题:解析存储后出现如下错误:
java.lang.NoSuchMethodError: No direct method (Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V in class Lkotlinx/serialization/ContextSerializer; or its super classes (declaration of 'kotlinx.serialization.ContextSerializer' appears in /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk)
实体: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>
)
实体: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
}
}
}
有什么想法吗?
提前致谢!
我找不到没有冲突的组合解决方案,所以我决定拆分模型:
- 每个 API 调用改造 2
- 每个 ObjectBox 实体的模型
我在从 Retrofit 获取数据后创建了 ObjectBox 实体。有点太多冗余,但它的工作原理。 :-)
我刚刚看到这个解决方案并写了一篇关于如何在不映射实体的情况下简单地做到这一点的文章。
希望对您有所帮助 ->
https://medium.com/@ryan.shaw_80293/android-local-database-tricks-with-kotlin-and-objectbox-f0da58c9d5a3
我正在使用 kotlinx.serialization to parse JSON from an API and ObjectBox 作为本地存储。
两个库都允许构建模型或实体 classes。我想避免冗余的 classes 并且更愿意将它们组合成一个实体 class 每个。
它工作正常,直到我不得不添加 relations。
我愿意接受 API 中的所有内容,这就是为什么每个字段都是 @Optional
的原因。验证是在实体的 ObjectBox
部分进行的。
您可以在下面找到所需的代码,但该代码不起作用。
第一个问题: @Optional
字段需要有默认值。添加 ? = null
(感觉很脏)后,我得到了
第二个问题:解析存储后出现如下错误:
java.lang.NoSuchMethodError: No direct method (Lkotlin/reflect/KClass;Lkotlinx/serialization/KSerializer;)V in class Lkotlinx/serialization/ContextSerializer; or its super classes (declaration of 'kotlinx.serialization.ContextSerializer' appears in /data/app/com.acme.myapp2A1fXerVu==/split_lib_dependencies_apk.apk)
实体: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>
)
实体: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
}
}
}
有什么想法吗?
提前致谢!
我找不到没有冲突的组合解决方案,所以我决定拆分模型:
- 每个 API 调用改造 2
- 每个 ObjectBox 实体的模型
我在从 Retrofit 获取数据后创建了 ObjectBox 实体。有点太多冗余,但它的工作原理。 :-)
我刚刚看到这个解决方案并写了一篇关于如何在不映射实体的情况下简单地做到这一点的文章。
希望对您有所帮助 -> https://medium.com/@ryan.shaw_80293/android-local-database-tricks-with-kotlin-and-objectbox-f0da58c9d5a3