我've added a value to a realm object (I'已将动态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目录/快捷/
How come the migration blick isn't called? "HERE"从未打印过......
我应该在视图控制器中以不同的方式定义领域吗?
5 回答
如果在视图控制器中将
let realm = try! Realm()
作为实例变量编写,则会在故事板中application: didFinishLaunchingWithOptions
之前调用它 . 要解决此问题,您可以改用lazy var realm = try! Realm()
.lazy
推迟创建实例变量,直到访问该变量 .在我的情况
schemaVersion: 1
,是低,并且从未调用迁移块 . 确保您的新版本比以前更大 .这是我的第一次迁移,但我必须将其更改为
schemaVersion: 2
然后才开始工作 .看起来你的一个视图控制器在
application: didFinishLaunchingWithOptions
之前创建了Realm,因此在那个时候没有设置带有迁移的默认配置 .确保在创建任何Realm实例之前配置
Realm.Configuration.defaultConfiguration
.在您的代码中,尝试调用:
之前:
它对我有用!
似乎问题是迁移是异步调用,我们只能在迁移完成后访问Realm . 所以流程应该是第一个:设置配置 . 第二:使用Realm.asyncOpen强制Realm更新并阻止其他可能访问的东西!领域() . 你可以在这里找到更多细节:https://realm.io/docs/swift/latest/#asynchronously-opening-realms