Как заменить основное поле в Realm для Android при миграции - PullRequest
0 голосов
/ 18 декабря 2018

Объект схемы БД 1 выглядел так:

open class LicenseAgreementEntity(
    @PrimaryKey
    var licenseAgreementID: String = UUID.randomUUID().toString(),
    var version: String = "",
    var acceptAgreementDate: String = "",
    var acceptAgreementStatus: String = AcceptAgreementStatus.ACCEPTED.name

) : RealmObject()

В схеме БД 2 объекта будут выглядеть так:

open class LicenseAgreementEntity(
    @PrimaryKey
    var accountID: String = UUID.randomUUID().toString(),
    var version: String = "",
    var acceptAgreementDate: String = "",
    var acceptAgreementStatus: String = AcceptAgreementStatus.ACCEPTED.name
) : RealmObject()

Мой код миграции выглядит следующим образом

realm?.let { transactionRealm ->
            val schema = transactionRealm.schema
            val licenseAgreementSchema = schema.get(TABLE_LICENSE_AGREEMENT_ENTITY) ?: return

            licenseAgreementSchema
                .renameField(FIELD_LICENSE_AGREEMENT_ID, FIELD_ACCOUNT_ID)
                .transform {
                    it.set(FIELD_ACCOUNT_ID, preference.accountID)
                }
        }

И проблема в том, что мне нужно обновить поле во время миграции на другое значение.Я пробовал разные варианты добавления / удаления поля и добавления / удаления первичного ключа, но похоже, что операция преобразования разрушает его.Любые идеи о том, как переименовать поле первичного ключа и изменить его значение при миграции?

Исключение:

 Caused by: java.lang.IllegalArgumentException: Primary key field 'accountID' cannot be changed after object was created.
...