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

    let config = Realm.Configuration(
        // Set the new schema version. This must be greater than the previously used
        // version (if you've never set a schema version before, the version is 0).
        schemaVersion: 1,

        // Set the block which will be called automatically when opening a Realm with
        // a schema version lower than the one set above
        migrationBlock: { migration, oldSchemaVersion in
            // We haven’t migrated anything yet, so oldSchemaVersion == 0
            if (oldSchemaVersion < 1) {
                // Nothing to do!
                // Realm will automatically detect new properties and removed properties
                // And will update the schema on disk automatically
            }
    })

    // Tell Realm to use this new configuration object for the default Realm
    Realm.Configuration.defaultConfiguration = config

    // Now that we've told Realm how to handle the schema change, opening the file
    // will automatically perform the migration
    let realm = try! Realm()

Это было помещено в приложение (application: didFinishLaunchingWithOptions:)

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

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int'
- Property 'reps' has been added to latest object model.}: file   /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/

Любые идеи?

Ответ 1

Пока вы находитесь только в локальной разработке, я бы рекомендовал вместо reset вашу базу данных Realm вместо миграции. Миграции - это путь, если вы уже отправили версию своего приложения с другой схемой и хотите сохранить пользовательские данные.

Вы можете удалить базу данных, удалив приложение из симулятора или устройства. В качестве альтернативы вы можете использовать NSFileManager для удаления файла Realm перед доступом к базе данных.

let defaultPath = Realm.Configuration.defaultConfiguration.path!
try NSFileManager.defaultManager().removeItemAtPath(defaultPath)

Ответ 2

У меня была аналогичная проблема, с которой произошло мое приложение, несмотря на то, что я добавил код миграции по умолчанию в didFinishLaunchingWithOptions

Проблема заключалась в том, что я действительно инициализировал экземпляр Realm в моем контроллере представления first как свойство уровня класса. Поэтому удаление этого объекта класса уровня класса из моего первого ViewController устранило проблему.

import UIKit
import RealmSwift

class ViewController: UIViewController{
  let db = try! Realm() // Removing this solved my issue

  func doSomething(){
    let db = try! Realm() // Placed this here instead
  }
}

Вместо этого я создал объект внутри функции, которая ему нужна, и это лучший подход.

Ответ 3

Убедитесь, что вы не пытаетесь создать экземпляр Realm() перед настройкой миграции в application(application:didFinishLaunchingWithOptions:). Когда он сбой проверяет выполнение стека, чтобы найти, какой экземпляр вызвал исключение. У меня была такая же ошибка, в моем случае экземпляр Realm в одном из моих контроллеров представлений был создан до того, как был установлен блок миграции.

Удачи.

Ответ 4

Я часто получаю ту же фатальную ошибку. Обычно это происходит, когда вы вносите изменения в объекты Realm с помощью "Первичных ключей". Самое быстрое и простое решение - просто удалить приложение с устройства или симулятора, а затем снова запустить проект.

Ответ 5

Вы уверены, что правильно обновили свою схему? Если вы установили schemaVersion: 1 перед внесением изменений, вам нужно изменить его на 2, чтобы миграция вызывалась.