Вы, кажется, делаете это правильно. Согласно 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
Это код в моем AppDelegate: Realm.Configuration.defaultConfiguration = Realm.Configuration ( schemaVersion: 1, migrationBlock: {миграция, oldSchemaVersion в , если (oldSchemaVersion <1) { } }) let realm = попробуйте! Realm() отлично работает, но когда он попадает на ViewController, он взрывается. Когда вы говорите, удалите приложение, что вы имеете в виду? – Daniel
Хорошо, понял, что вы имели в виду, удалив его - Спасибо Прежде чем я решит придерживаться Realm, мне нужно быть уверенным, что я смогу правильно перенести миграцию, чтобы я не испортил работу пользователей. Оцените время, проведенное – Daniel
Я попытался воспроизвести вашу ошибку без успеха. Хотя я заметил несколько деталей, которые произошли со мной по дороге и добавили их в ответ. – Edman