我在我的应用程序中使用kotlin和ObjectBox。我的对象框实体看起来像
@Entity
class Order {
@Id var id: Long = 0
lateinit var customer: ToOne<Customer>
}
@Entity
class Customer {
@Id var id: Long = 0
@Backlink
lateinit var orders: List<Order>
}
但是当我使用@Parcelize时,包裹中的属性被忽略。我如何使用@Parcelize但仍然包含这些属性?我尝试重写writeToParcel,但由于@Parcelize,我不允许覆盖它。
答案 0 :(得分:0)
根据docs,您必须在主构造函数中声明所有属性,这些属性应通过@Parcelize
序列化。所有其他的都被忽略了。
ObjectBox不支持ToOne
,因此您必须编写自定义Parceler
。最后,您的解决方案应如下所示:
@Entity
@Parcelize
@TypeParceler<ToOne<Customer>, ToOneCustomerParceler>
class Order(
@Id var id: Long = 0,
var customer: ToOne<Customer>
) : Parcelable
@Entity
@Parcelize
class Customer(
@Id var id: Long = 0,
@Backlink var orders: List<Order>
) : Parcelable
object ToOneCustomerParceler : Parceler<ToOne<Customer>> {
override fun create(parcel: Parcel): ToOne<Customer> {
//Somehow recreate ToOne instance
...
}
override fun ToOne<Customer>.write(parcel: Parcel, flags: Int) {
val customer = target
...
}
}
也不要忘记包含正确的依赖项:
dependencies {
compile "io.objectbox:objectbox-android:$objectboxVersion"
compile "io.objectbox:objectbox-kotlin:$objectboxVersion"
}
P.S。为每个目的使用不同的模型(@Entity
和@Parcelize
),即使两者都相同。管理它们要容易得多,因为您将意图分为两个模型,而不是试图将所有内容分成单个模型。