Требуется миграция из-за того, что ID объекта был необходим - PullRequest
0 голосов
/ 25 сентября 2019

работает нормально, если я изменяю lateinit var id: String в Payment.kt и CartPayment.kt на var id: String? = "", но проблема в том, что я хочу, чтобы идентификатор был обязательным, как мне этого добиться?

Ошибка:

java.lang.RuntimeException: Unable to create application: io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
    - Property 'CartPayment.id' has been made required.
    - Property 'Payment.id' has been made required.

Модель:

open class Payment() : RealmObject() {

    @PrimaryKey
    lateinit var id: String
    var typeValue: Int = 0
    var statusValue: Int = 0
    var value: Double = 0.0
    var referenceNumber: String? = null

Примечание. Модели Payment и CartPayment идентичны, за исключением имени класса

Migration.kt

class Migration : RealmMigration {

    override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
        var oldVersion = oldVersion
        val schema = realm.schema

        if (oldVersion == 0L) {
            schema.create("Payment")
                .addField("id", String::class.java, FieldAttribute.PRIMARY_KEY)
                .addField("typeValue", Int::class.java)
                .addField("statusValue", Int::class.java)
                .addField("value", Double::class.java)
                .addField("referenceNumber", String::class.java)
            schema.get("Order")!!
                .addRealmListField("payments", schema.get("Payment")!!)
            oldVersion++
        }

        if (oldVersion == 1L) {
            schema.create("CartPayment")
                .addField("id", String::class.java, FieldAttribute.PRIMARY_KEY)
                .addField("typeValue", Int::class.java)
                .addField("statusValue", Int::class.java)
                .addField("value", Double::class.java)
                .addField("referenceNumber", String::class.java)
            schema.get("Order")!!
                .addField("cashPaymentAmount", Float::class.java)
                .addField("change", Float::class.java)
            oldVersion++
        }

    }
}

App.kt

class App: Application() {

    override fun onCreate() {
        super.onCreate()

        Realm.init(this)

        val realmConfig = RealmConfiguration.Builder()
            .schemaVersion(2)
            .migration(Migration())
            .build()
        Realm.getInstance(realmConfig)
        Realm.setDefaultConfiguration(realmConfig)

        Fresco.initialize(this)
    }
}

1 Ответ

0 голосов
/ 26 сентября 2019

В основном вы добавляете новое поле "id", которое является первичным ключом (следовательно, обязательным ключом).Если вы не укажете какое-либо значение во время инициализации (lateinit), как область перенесет все более ранние записи, у которых нет идентификатора, но они необходимы после миграции?Отсюда и ошибка.

Нижеприведенные решения могут работать

  1. Либо предварительно заполнить идентификаторы (без использования lateinit)
  2. Преобразуйте свои более ранние записи в идентификаторы, если они не

Проверьте официальные примеры здесь

...