更新iOS核心数据版本以避免崩溃

时间:2015-08-14 11:20:29

标签: ios core-data core-data-migration

我更新了我的iOS应用程序,其中包括对Core Data模型进行了一些更改。然后我将新版本上传到App Store后,人们开始尝试使用它,应用程序崩溃了!

我现在明白这是因为用户在其设备上拥有旧版Core Data并且与新版本不兼容。我已经读过我应该更新模型版本所以现在就是我正在做的事情。

虽然我已经读到我应该在进行更改之前更新模型版本,但我对此略显紧张。显然我不能及时回去 - 改变了,而且在我做之前我没有更新外翻。那么现在只需更改模型版本并期望它在我的用户设备上正常工作而不会崩溃或者我可以/必须做的其他事情是否可以?

实际数据不是很重要,很快就会被替换,所以我不在乎他们是否可以保留数据。我只是需要他们才能更新应用程序而不会在下次尝试使用它时崩溃。

2 个答案:

答案 0 :(得分:1)

Swift 3

    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.appendingPathComponent("name.sqlite")
    let walUrl = url.deletingPathExtension().appendingPathExtension("sqlite-wal")
    let shmUrl = url.deletingPathExtension().appendingPathExtension("sqlite-shm")
    do {
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
    } catch {
        do {
            try FileManager.default.removeItem(at: url)
            try FileManager.default.removeItem(at: walUrl)
            try FileManager.default.removeItem(at: shmUrl)
            try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
        } catch let error as NSError {
            //handle error
        }
    }

答案 1 :(得分:0)

如果您使用Core Data模型进行更改,则必须在上载新版本之前完成整个迁移过程。否则它只适用于新用户,旧用户将崩溃。现在,您必须将数据模型迁移到新版本,然后再次上载构建。 这是唯一的解决方案,更多只需阅读此链接:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmMigrationProcess.html#//apple_ref/doc/uid/TP40004399-CH6-SW1