领域迁移不称为

时间:2017-01-18 19:36:04

标签: ios swift migration 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()。当我运行应用程序时,Xcode中断了:

  

“由于以下错误,需要迁移:    - 已添加属性'WeekReport.inspectorName'。“UserInfo = {NSLocalizedDescription =由于以下错误,需要迁移:    - 已添加属性'WeekReport.inspectorName'。,错误代码= 10}:file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.63/src/swift /

为什么不调用迁移服务?“HERE”从未打印过......

我应该在视图控制器中以不同的方式定义领域吗?

5 个答案:

答案 0 :(得分:4)

如果您在视图控制器中将let realm = try! Realm()写为实例变量,则会在Storyboard application: didFinishLaunchingWithOptions之前调用它。要解决此问题,您可以改用lazy var realm = try! Realm()lazy推迟创建实例变量,直到访问该变量。

答案 1 :(得分:2)

在我的案例中schemaVersion: 1,从低到没有调用迁移块。确保您的新版本比之前版本更高。

这是我的第一次迁移,但我必须将其更改为schemaVersion: 2然后才开始工作。

答案 2 :(得分:0)

  

在多视图控制器中,我有let realm = try! Realm()

看起来你的一个视图控制器在application: didFinishLaunchingWithOptions之前创建了Realm,因此在那个时候没有设置迁移的默认配置。

确保在创建任何Realm实例之前配置Realm.Configuration.defaultConfiguration

答案 3 :(得分:0)

在您的代码中,尝试调用:

 _ = try! Realm()

之前:

return true

它对我有用!

答案 4 :(得分:0)

问题似乎是迁移是异步调用,我们只能在迁移完成后访问Realm。所以流程应该是第一个:设置配置。第二:使用Realm.asyncOpen强制Realm更新并阻止其他可能访问的东西!领域()。你可以在这里找到更多细节: https://realm.io/docs/swift/latest/#asynchronously-opening-realms