Parcelize и ObjectBox конфликтуют - PullRequest
0 голосов
/ 28 мая 2018

Я использую 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 голосов
/ 28 мая 2018

Согласно 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"
}

PS Используйте разные модели для каждой цели (@Entity и@Parcelize), даже если оба они одинаковы.Управлять ими гораздо проще, поскольку вы разделяете свои намерения на две модели, а не пытаетесь объединить все в одну.

...