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

标签 ios core-data backup database-backups nspersistentstore

我花了很长时间来找出正确的方法来创建 Core-Data 支持的 .sqlite 文件的备份并将该备份存储在本地和/或 iCloud 中(无论用户喜欢什么)以供下载、还原或分享。让我先声明一下,我不是在谈论将持久存储移动到 iCloud 以供应用程序用作其数据源。我只是问在这个问题中创建备份文件。

2014 年,Apple 将 Core Data SQLite 存储的默认日志记录模式更改为 WAL。

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

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

To safely back up and restore a Core Data SQLite store, you can do the following: Use the following method of NSPersistentStoreCoordinator class, rather than file system APIs, to back up and restore the Core Data store: - (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

Note that this is the option we recommend.

在此之前,我一直在使用 NSFileManager 创建备份。有了这个建议,我相信在本地创建备份的正确方法是添加一个新的持久存储,然后将该持久存储迁移到所需的备份位置,使用 NSPersistentStoreCoordinator 方法分别是 addPersistentStoreWithType:configuration:URL:options:errormigratePersistentStore: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:error,和 migratePersistentStore:toURL:options:withType:error 获取 本地所需的 .sqlite 副本,但如果我随后尝试上传该本地文件 文件到 iCloud,我担心我会丢失我努力保存的数据 使用 migratePersistentStore:toURL:options:withType:error 第一名。我一直在尝试看看是否有办法让我 可以/应该使用 migratePersistentStore:toURL:options:withType:error 移动 新创建的 persistentStore 直接到 iCloud,但我还没有 能够找到有关如何执行此操作或是否应该执行此操作的任何文档 完全完成了。是否需要使用特定的 url 来指示 persistentStore 的目的地是 iCloud?

如果您能就这些问题的答案分享任何见解,我将不胜感激。

最佳答案

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

关于共享的 CoreData 存储版本,您必须小心。假设两个用户运行不同版本的应用程序并在彼此之间共享 CoreData 存储。 CoreData 不支持开箱即用的渐进式迁移。 https://www.objc.io/issues/4-core-data/core-data-migration/

与共享整个图表相比,共享 JSON 中的一部分数据并从中重新创建 CoreData 实体可能是更安全、更轻松的共享数据策略。

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

关于ios - 如何使用当前的 NSPersistentStore 方法在本地和 iCloud 中创建可共享的 Core Data .sqlite 备份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579357/

相关文章:

iOS 在呈现为模板的图像上使用默认颜色

ios - cellForRowAtIndexPath 和过滤数据

ios - 删除/编辑核心数据对象时遵循逻辑和关系

amazon-web-services - 如何使用 s3cmd 仅移动更改为 Amazon S3 的文件?

amazon-web-services - 如何在 Amazon S3 上存储 bacula(社区版)备份?

android - 现在有人知道如何注册 Google Backup API key 吗?

ios - UIStoryboard Show(例如push)简单的逆向 Action 返回

ios - 你如何使背景图像快速缩放到屏幕大小?

ios - Tableview获取索引超出空数组范围

iOS CoreData NSPredicate 未清除