Миграция в области не называется

Я добавил значение к объекту realm (я добавил динамический var inspectorName = "" к объекту WeekReport), и я пытаюсь перенести базу данных области, чтобы содержать это значение. Я пытаюсь вызвать блок миграции в func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? = nil) следующим образом:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    print("HERE")
    Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 1,
        migrationBlock: { migration, oldSchemaVersion in
            if (oldSchemaVersion < 1) {
                migration.enumerateObjects(ofType: WeekReport.className()) { oldObject, newObject in
                    newObject!["inspectorName"] = ""
                }
            }
    })

    return true
}

Но кажется, что didFinishLaunchingWithOptions не вызывается до того, как произойдет моя ошибка.

В контроллере множественного представления я let realm = try! Realm() let realm = try! Realm(). Здесь Xcode прерывается при запуске приложения:

"Миграция требуется из-за следующих ошибок: - добавлено свойство" WeekReport.inspectorName "". UserInfo = {NSLocalizedDescription = требуется миграция из-за следующих ошибок: - добавлено свойство 'WeekReport.inspectorName', код ошибки = 10}: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang- 800.0.63/SRC/быстрое/

Почему миграционный клик не называется? "ЗДЕСЬ" никогда не печатается...

Должен ли я определять область по-другому в моих контроллерах?

+5
источник поделиться
5 ответов

Если вы напишете let realm = try! Realm() let realm = try! Realm() в контроллере представления в качестве переменной экземпляра, он будет вызван перед application: didFinishLaunchingWithOptions из Storyboard. Чтобы решить эту проблему, вы можете использовать lazy var realm = try! Realm() lazy var realm = try! Realm(). lazy defers создает переменную экземпляра до тех пор, пока не будет доступна переменная.

+4
источник

В моем случае schemaVersion: 1, был низким, и блок миграции никогда не вызывался. Убедитесь, что ваша новая версия больше предыдущей.

Это была моя первая миграция, но мне пришлось изменить ее на schemaVersion: 2 а затем она начала работать.

+1
источник

В контроллере множественного представления я let realm = try! Realm() let realm = try! Realm().

Кажется, что один из ваших контроллеров просмотров создает Realm перед application: didFinishLaunchingWithOptions, поэтому к этому моменту настройка по умолчанию с application: didFinishLaunchingWithOptions не установлена.

Убедитесь, что вы сконфигурировали Realm.Configuration.defaultConfiguration перед Realm.Configuration.defaultConfiguration любых экземпляров Realm.

0
источник

В своем коде попробуйте позвонить:

 _ = try! Realm()

до:

return true

Это сработало для меня!

0
источник

Кажется, проблема заключается в том, что миграция - это асинхронный вызов, и мы можем получить доступ к Царству только после завершения миграции. Итак, поток должен быть первым: установите конфигурацию. Второе: используйте Realm.asyncOpen, чтобы принудительно обновить Realm и удержать другие вещи, которые могут получить доступ к try! Realm(). Вы можете найти более подробную информацию здесь: https://realm.io/docs/swift/latest/#asynchronously-opening-realms

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос