如何使用当前的NSPersistentStore方法在本地和iCloud中创build可共享的Core Data .sqlite备份

我已经花费了相当长的时间来创build一个Core-Data备份的.sqlite文件的备份,并在本地和/或iCloud(无论用户喜欢什么)存储该备份以用于下载,恢复或分享。 让我先说一下,我并不是在谈论将持久存储转移到iCloud以供应用程序用作其数据源。 我只是问在这个问题上创build备份文件。

在2014年,苹果将核心数据SQLite商店的默认日记模式更改为WAL。

https://developer.apple.com/library/content/qa/qa1809/_index.html

随着这一变化,他们build议:

要安全地备份和还原Core Data SQLite存储,可以执行以下操作:使用以下NSPersistentStoreCoordinator类的方法(而不是文件系统API)备份和还原Core Data存储: – (NSPersistentStore *)migratePersistentStore 🙁 NSPersistentStore *)存储toURL:(NSURL *)URL选项:(NSDictionary *)options withType:(NSString *)storeType错误:(NSError **)错误

请注意,这是我们推荐的选项。

在此之前,我一直在使用NSFileManager来创build备份。 有了这个build议,我相信在本地创build备份的正确方法是添加一个新的持久性存储,然后使用NSPersistentStoreCoordinator方法addPersistentStoreWithType:configuration:URL:options:error将该持久性存储迁移到所需的备份位置migratePersistentStore:toURL:options:withType:error

我的问题有两个方面:

  1. 我以前会将我的数据压缩到NSData之前导出它,并将NSData直接写入文件。 我的文件扩展名将自定义到我的应用程序,通过电子邮件或其他iOS共享方法共享压缩数据。 使用migratePersistentStore:toURL:options:withType:error方法,我现在将得到一个.sqlite文件(及其相应的WAL文件等)在所需的位置,但我不知道如何共享此文件。 如果我压缩文件,不会有我失去了我努力保存的数据的危险,首先使用migratePersistentStore:toURL:options:withType:error ? 我相信是这样,但我确实希望让我的用户能够通过电子邮件等方式共享/保存备份,而现在我不知道该如何做到最好。
  2. 我很难理解如何使用migratePersistentStore:toURL:options:withType:error将文件备份到iCloud。 就像上面的共享示例一样,我看到我可以使用addPersistentStoreWithType:configuration:URL:options:errormigratePersistentStore:toURL:options:withType:error在本地获取所需的.sqlite副本,但如果我尝试上传本地文件到iCloud,我担心我会失去使用migratePersistentStore:toURL:options:withType:error工作保存的数据。 我一直在试图看看是否有一种方法可以/应该使用migratePersistentStore:toURL:options:withType:error将新创build的persistentStore直接移动到iCloud,但是我一直没能find任何关于如何这样做还是应该完成。 是否有一个特定的url,我需要用来表明persistentStore的目的地是iCloud?

我将不胜感激关于这些问题的答案可以分享的任何见解。

    1. 因为它有用于数据完整性validation的CRC数据,所以ZIP应该是安全的IMO方式。

    你必须小心,虽然共享的CoreData存储版本。 假设两个用户运行不同版本的应用程序,并相互共享CoreData存储。 CoreData不支持渐进式迁移。 https://www.objc.io/issues/4-core-data/core-data-migration/

    也许在JSON中共享一部分数据并从中重新创buildCoreData实体将是更安全和更简单的共享数据策略,而不是共享整个graphics。

    1. 您只能将文件复制到iCloud容器并跨设备共享,但您不能直接从容器使用它,或者通过iCloud进行增量更新。 NSFileManager具有setUbiquitous ,允许将文件移动到iCloud容器中。