我有一个使用标准核心数据堆栈的Swift 3 IOS 10应用程序。我的一些用户报告称在升级到最新版本的应用时会丢失数据。似乎正在发生的事情是,即使模型没有改变,也创建了一个新的数据存储,并且没有迁移。
我可以通过获取已发布的版本 - 数据集1来重新创建它。但是当我将我的开发版本推送到我的设备时,数据集1就消失了。我可以在数据集2中添加记录,并且它仍然存在。但如果我回到应用程序商店并获得已发布的版本,数据集1将再次出现。
有人可以解释为什么会发生这种情况并阻止它。我错过了一些简单的事吗?提前谢谢......
答案 0 :(得分:0)
我有类似的问题,当我在AppDelegate中更改此部分时,它为我修复了它。
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
// The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
// Create the coordinator and store
let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("SingleViewCoreData.sqlite")
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: [NSMigratePersistentStoresAutomaticallyOption: true,
NSInferMappingModelAutomaticallyOption: true]) //THIS LINE
} catch {
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
答案 1 :(得分:0)
感谢大家的回复。我确实使用了源代码控制并确认没有任何改变。问题似乎不是检查是否存在现有数据存储。根据Apple的文档,当应用程序升级到新版本时,文档目录的内容将从先前版本的目录中复制,然后删除。这似乎并不是一直发生的。在应用程序打开时添加代码以检查现有数据存储,然后将其复制到工作目录(如果找到),似乎已解决了此问题。