Почему версия схемы Realm сбрасывается в 0 после миграции? - PullRequest
0 голосов
/ 19 марта 2019

Я пытаюсь выполнить миграцию Realm с помощью следующего кода:

let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
let config = Realm.Configuration(
            schemaVersion: version + 1,
            migrationBlock: { migration, oldSchemaVersion in
                if oldSchemaVersion < 1 {
                    migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
                        // Here I transfer existing data to new properties
                    }
                }
        })
Realm.Configuration.defaultConfiguration = config
let _ = try! Realm()

Миграция работает нормально, но в следующий раз, когда приложение будет перезапущено, текущая и старая версии схемы будут равны 0, несмотря на то, что при миграции, имевшей место при первом запуске, было установлено значение 1.

Но миграция выполнена, поэтому условие if выполняется, и приложение вылетает с исключением Realm, вызванным попыткой выполнить миграцию снова.

Может кто-нибудь помочь мне понять, чего мне не хватает? Если конфигурация устанавливает версию схемы на 1 во время миграции, почему она равна 0 при следующем перезапуске приложения?

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Оказывается, проблема была в том, что на самом деле вызывали Realm до выполнения миграции. Я забыл немного кода, который выполнял в willFinishingLaunchingWithOptions, который вызывал его.

Извлеченный урок: Только самый первый вызов Realm выполняет миграцию.

0 голосов
/ 19 марта 2019

Миграция работает нормально, но в следующий раз приложение перезапущен, текущая и старая версии схемы равны 0,

Это происходит, когда вы удаляете локальный файл Realm и переустанавливаете его, обычно это происходит при удалении и переустановке приложения,

Realm автоматически обрабатывает миграции, все, что нужно знать, если существует новый номер версии, который заставит файл переписать его самостоятельно с новыми правилами.


Теперь для сбойной части вы используете это, проблема с open stat на github

let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)

Однако я согласен с этим комментарием.

Полагаю, здесь есть две проблемы:

1 - Похоже, schemaVersionAtURL() создает пустой файл, если дано URL для файла, который не существует, и он, очевидно, не должен быть делать это.
2- В Swift schemaVersionAtURL() должно быть UInt64? и просто верните ноль, если файл не существует, а не выбрасывает

Я рекомендую использовать обычную Int для версии, а не получать ее из файла, как показано в Realm документах , schemaVersion: 1, и увеличивать его вручную, это позволит вам всегда видеть, на каком номере версии вы находитесь, и при сбое вы знаете, что сделали что-то достойное для миграции.

Теперь о той части, где вы говорите.

текущей и старой версиями схемы являются 0

Когда вы переустанавливаете свое приложение, оно просто воссоздает файл с версией 0, потому что новые правила, которые ваш код реализовал для Realm, это просто простой новый файл, так что установка более низкой версии кода в коде не будет иметь большого значения, однако это не так. рекомендуется, потому что, когда вы выходите в эфир, люди не будут переустанавливать приложение, они будут обновлять его, поэтому файл Realm переносится в старшую версию, однако новые пользователи, загружающие приложение с номером версии 0, поэтому следует думать об этом как о изменение должно быть сделано вместо числа приращения, только чем больше, тем лучше .

...