Почему после миграции версия схемы области сбрасывается до 0?

Я пытаюсь выполнить миграцию 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 при следующем перезапуске приложения?


person Foefirelord    schedule 19.03.2019    source источник
comment
После миграции вы удалите приложение и переустановите его?   -  person A.Munzer    schedule 19.03.2019
comment
@ A.Munzer, если бы он это сделал, это установило бы миграцию на 0, однако, если он этого не сделает, я не думаю, что он вообще получает правильную версию.   -  person Mohmmad S    schedule 19.03.2019
comment
@MohmmadS, разберись в проблеме, он забыл удалить старую схему области.   -  person A.Munzer    schedule 19.03.2019
comment
@ A.Munzer Зачем ему?   -  person Mohmmad S    schedule 19.03.2019


Ответы (2)


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

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

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


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

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

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

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

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

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

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

как текущая, так и старая версия схемы равны 0

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

person Mohmmad S    schedule 19.03.2019
comment
Более того, это может быть открытая проблема, или он использует ее неправильно, потому что тестирование с областью имеет различные случаи, такие как удаление приложения, необходимость миграции приложения и т. Д. - person Mohmmad S; 19.03.2019
comment
Так что, если он установит для схемы статически значение 1, его проблема будет решена. - person A.Munzer; 19.03.2019
comment
его проблема не в количестве, которое нужно установить больше, чем в том, что происходит, номер его версии - это то, что он выбирает правильный, я просто объясняю, что, вероятно, с ним происходит. - person Mohmmad S; 19.03.2019

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

Извлеченный урок: Перенос выполняется только при первом вызове Realm.

person Foefirelord    schedule 19.03.2019