-1

我在我的应用程序中使用 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,我不允许覆盖它。

4

1 回答 1

0

根据docs,您必须在主构造函数中声明所有属性,这些属性应通过@Parcelize. 所有其他的都被忽略。

ObjectBox 不支持ToOne,所以你必须编写 custom 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"
}

PS 为每个目的(@Entity@Parcelize)使用不同的模型,即使两者相同。管理它们要容易得多,因为您将您的意图分成 2 个模型,而不是试图将所有内容都集中到一个模型中。

于 2018-05-28T05:39:12.010 回答