我目前有一个使用 Core Data 和 Apple 的 NSPersistentCloudKitContainer
的应用程序我有 2 位用户提到他们在更新应用时丢失了数据 - 我正在使用轻量级迁移,他们唯一的共同点是:都没有留下 iCloud 存储空间。 p>
经过进一步检查,我注意到,如果我转到“设置”>“iCloud”>“为我的应用程序禁用它”,则每当我再次打开应用程序时,所有数据都会消失。
有人遇到过这个问题吗?这是预期的吗?有办法解决吗?
作为引用,这是我的设置代码:
self.container = NSPersistentCloudKitContainer(name: "DATABASE_NAME")
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
Crashlytics.crashlytics().record(error: error)
}
self.container.viewContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy
self.container.viewContext.automaticallyMergesChangesFromParent = true
})
最佳答案
您可以添加对 iCloud 容器可用性的检查:
func isICloudContainerAvailable()-> Bool {
if let _ = FileManager.default.ubiquityIdentityToken {
return true
} else {
return false
}
}
根据检查结果,您可能会返回 NSPersistentCloudKitContainer
或 NSPersistentContainer
。您还应该为 NSPersistentContainer 案例启用 NSPersistentHistoryTrackingKey
:
lazy var persistentContainer: NSPersistentContainer = {
var container: NSPersistentContainer!
if isICloudContainerAvailable() {
container = NSPersistentCloudKitContainer(name: "DATABASE_NAME")
} else {
container = NSPersistentContainer(name: "DATABASE_NAME")
let description = container.persistentStoreDescriptions.first
description?.setOption(true as NSNumber, forKey: NSPersistentHistoryTrackingKey)
}
...
return container
}
这样,如果您转到“设置”>“iCloud”>“为应用禁用它”,应用中的数据仍然可用(它将使用 NSPercientContainer
)。如果您重新启用 iCloud,应用程序中的所有更改也将同步。
但是,如果用户在“管理帐户存储”中手动删除该应用程序的 iCloud 数据,该应用程序中的数据将会丢失,正如警报中所述:“这将删除该应用程序存储在此 iPhone 和 iCloud 中的所有数据”。我找不到这种情况下保存本地数据的方法。
关于swift - 使用 NSPersistentCloudKitContainer 时核心数据数据库被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70755205/