swift - 使用 NSPersistentCloudKitContainer 时核心数据数据库被删除

标签 swift core-data cloudkit nspersistentcloudkitcontainer

我目前有一个使用 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
    }
}

根据检查结果,您可能会返回 NSPersistentCloudKitContainerNSPersistentContainer。您还应该为 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/

相关文章:

iphone - 如何在 iOS 框架中添加核心数据类

ios - 无法通过 recordName UUID 查询单个 CloudKit 记录

ios - 快速自动播放声音

swift - 随机图像数组(xcode 6,swift2)

ios - CoreData - 如何快速创建具有现有对象的重复对象

iphone - 具有对多关系的复杂核心数据谓词

ios - 如何将 ckrecords 从默认区域迁移到自定义区域?

Swift CloudKit QueryOperation 重复

swift - 在 Swift 中,有没有一种方法可以确定枚举是否基于某种类型(例如 String)?

Swift:减少 Init 方法的长度