【问题标题】:Realm migration not called未调用领域迁移
【发布时间】:2017-06-03 08:04:56
【问题描述】:

我已向领域对象添加了一个值(我已向 WeekReport 对象添加了动态 var inspectorName = ""),并且我正在尝试迁移领域数据库以包含该值。我正在尝试像这样在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}:文件 /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.63/src/swift/

为什么没有调用迁移 blick? 从来没有打印过“HERE”...

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

【问题讨论】:

    标签: ios swift migration realm


    【解决方案1】:

    在我的情况下,schemaVersion: 1 太低了,并且从未调用过迁移块。确保您的新版本高于以前的版本。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 没有。我在这里有同样的问题。我把试试!在 didLoad 中的领域,并确保仅在设置 Configuration.default 后调用它。仍然得到与@Wiingaard 相同的崩溃和错误消息。 Realm.Configuration的migrationBlock中的代码我直接调用Realm.performMigration也没有执行
        • 将它从 let realm = try! Realm() 切换到 lazy var realm = try! Realm() 对我有用。
        • 嘿伙计们,我正在处理一个预编码的项目,它有很多屏幕创建领域对象,如可达性、应用程序激活、第一个屏幕,所以许多通知者。我真的需要帮助来解决这个问题,因为无论如何我的迁移块都不会被调用。 @岸川胜美。请分享您的解决方案
        • @Anson Yao 如果你修复了请分享
        【解决方案4】:

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

         _ = try! Realm()
        

        之前:

        return true
        

        它对我有用!

        【讨论】:

          【解决方案5】:

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

          您的一个视图控制器似乎在application: didFinishLaunchingWithOptions 之前创建了Realm,因此到那时还没有设置带有迁移的默认配置。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多