2015-10-14 6 views
0

Извиняюсь за загрузку, что может показаться дублирующимся вопросом.Проблема миграции Realm

Я впервые пытаюсь реализовать Realm - я создал тестовый проект для его работы. Я добавил еще одно свойство в класс модели, а затем получил сообщение об ошибке изменения и миграции. Я выполнил инструкции и установил некоторый код в AppDelegate для миграции (хотя блок миграции был пуст, так как я удалил все записи), но в тот момент, когда он попадает на мой ViewController после его запуска, он выходит из строя с «Приведенная версия схемы меньше последней установленной версии 1 ", и я просто не могу пройти мимо него?

Это не работает в моем ViewController на var realm = try! Realm()

Что мне не хватает?

ответ

4

Вы, кажется, делаете это правильно. Согласно realm documentation:

В самый минимум все, что нам нужно сделать, это обновить версию с пустого блока, чтобы указать, что схема была обновлена ​​(автоматически) Realm.

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

На основании ошибки вы получаете

условии схемы версия 0 меньше последней установленной версии 1

Похоже, что миграция не выполняется вообще. В любом случае, каждый раз, когда вы обновляете схему, вы также должны увеличивать schemaVersion в конфигурации домена . Эта ошибка означает, что ваша конфигурация содержит версию (0), меньшую, чем версия существующей базы данных на диске (1). В этом случае ваша новая конфигурация должна иметь schemaVersion не менее 2 (что-то большее, чем версия на диске).

Перед когда инстанцирования области, как в вашем приложении делегату application:didFinishLaunchingWithOptions:, вы бы минимально нужно что-то вроде следующих в соответствии с текущим schemaVersion.

let config = Realm.Configuration(
    schemaVersion: 2, // Must be greater than previous version 
    migrationBlock: { migration, oldSchemaVersion in 
    if (oldSchemaVersion < 1) { 
     // minimally this can be empty 
    } 
    if (oldSchemaVersion < 2) { 
     // minimally this can be empty 
    } 
    print("Realm migration did run") // Log to know migration was executed 
    }) 

// Make sure to set the default configuration 
Realm.Configuration.defaultConfiguration = config 

Я также рекомендовал бы вам сделать некоторые протоколирование или установить точки останова как в миграционном блоке, так и в контроллере представления, прежде чем инстанцирование области. Таким образом, вы можете узнать, выполнялась ли миграция.

Однако, поскольку кажется, что вы только учитесь realm, я рекомендую вам игнорировать детали миграции на данный момент. Чтобы избежать этого, вы можете удалить свое приложение с устройства/симулятора всякий раз, когда вы вносите изменения в схему базы данных. Просто убедитесь, что вы используете schemaVersion как 0, и у вас всегда будет новая база данных для работы, поэтому миграции не нужны.

Второй вариант - использовать in-memory realms. Они не сохраняются на диске, поэтому данные не сохраняются при запуске приложений, но он по-прежнему работает как обычная база данных realte. Это идеально подходит для прототипов на ранней стадии. Чтобы получить один из них, вам просто нужно указать свою конфигурацию inMemoryIdentifier.

let config = Realm.Configuration(inMemoryIdentifier: "ThisRealmIsNotStored") 
Realm.Configuration.defaultConfiguration = config 
+0

Это код в моем AppDelegate: Realm.Configuration.defaultConfiguration = Realm.Configuration ( schemaVersion: 1, migrationBlock: {миграция, oldSchemaVersion в , если (oldSchemaVersion <1) { } }) let realm = попробуйте! Realm() отлично работает, но когда он попадает на ViewController, он взрывается. Когда вы говорите, удалите приложение, что вы имеете в виду? – Daniel

+0

Хорошо, понял, что вы имели в виду, удалив его - Спасибо Прежде чем я решит придерживаться Realm, мне нужно быть уверенным, что я смогу правильно перенести миграцию, чтобы я не испортил работу пользователей. Оцените время, проведенное – Daniel

+0

Я попытался воспроизвести вашу ошибку без успеха. Хотя я заметил несколько деталей, которые произошли со мной по дороге и добавили их в ответ. – Edman

Смежные вопросы