我已经为领域对象添加了一个值(我已经将动态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”从未打印过......
我应该在视图控制器中以不同的方式定义领域吗?
答案 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