Parcelize和ObjectBox冲突

时间:2018-05-28 05:10:29

标签: kotlin kotlin-android-extensions objectbox

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

1 个答案:

答案 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),即使两者都相同。管理它们要容易得多,因为您将意图分为两个模型,而不是试图将所有内容分成单个模型。