Ios 如何使用当前的NSPersistentStore方法在本地和iCloud中创建可共享的核心数据.sqlite备份

Ios 如何使用当前的NSPersistentStore方法在本地和iCloud中创建可共享的核心数据.sqlite备份,ios,core-data,backup,database-backups,nspersistentstore,Ios,Core Data,Backup,Database Backups,Nspersistentstore,我已经花了相当长的时间来找出正确的方法来创建一个核心数据备份.sqlite文件的备份,并将该备份存储在本地和/或iCloud(无论用户喜欢什么)中,以便下载、恢复或共享。让我先声明一下,我不是说将永久存储移动到iCloud,由应用程序用作其数据源。在这个问题中,我只是想问一下如何创建备份文件 2014年,苹果将核心数据SQLite商店的默认日志记录模式改为WAL 根据这一变化,他们建议: 要安全地备份和恢复核心数据SQLite存储,可以执行以下操作 以下: 使用以下NSPersistentSt

我已经花了相当长的时间来找出正确的方法来创建一个核心数据备份.sqlite文件的备份,并将该备份存储在本地和/或iCloud(无论用户喜欢什么)中,以便下载、恢复或共享。让我先声明一下,我不是说将永久存储移动到iCloud,由应用程序用作其数据源。在这个问题中,我只是想问一下如何创建备份文件

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

根据这一变化,他们建议:

要安全地备份和恢复核心数据SQLite存储,可以执行以下操作 以下: 使用以下NSPersistentStoreCoordinator类的方法,而不是 而不是文件系统API,用于备份和恢复核心数据存储: -(NSPersistentStore*)迁移PersistentStore:(NSPersistentStore*)存储区旅行路线:(NSURL*)URL选项:(NSDictionary*)带类型的选项:(NSString*)存储类型错误:(NSError**)错误

请注意,这是我们建议的选项

在此之前,我一直在使用NSFileManager创建备份。根据这一建议,我认为在本地创建备份的正确方法是添加一个新的持久存储,然后使用 NSPersistentStoreCoordinator方法分别是
addPersistentStoreWithType:configuration:URL:options:error
migratePersistentStore:toURL:options:withType:error

我的问题有两个:

  • 我以前会在导出数据之前将数据压缩到NSData 将NSData直接写入文件。我的文件扩展名是 自定义我的应用程序,通过电子邮件或其他方式共享压缩数据 iOS共享方法。和
    migratePersistentStore:toURL:options:withType:error
    method,我现在 在中以.sqlite文件(及其相应的WAL文件等)结束 所需位置,但我无法确定如何共享此文件 现在。如果我压缩了文件,我会不会有丢失我保存的数据的危险 努力通过使用
    migratePersistentStore:toURL:options:withType:error
    在第一个字段中 地点?我相信是这样,但我确实想让我的用户能够共享/保存他们的 备份和电子邮件等,我现在不知道如何最好地处理这个问题
  • 我很难理解怎么做
    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
  • 我将非常感谢能够就这些问题的答案分享的任何见解

  • ZIP应该是IMO的安全方式,因为它有用于数据完整性验证的CRC数据
  • 但是,对于共享CoreData存储版本,您必须小心。假设两个用户运行不同版本的应用程序,并彼此共享CoreData存储。CoreData不支持开箱即用的渐进式迁移

    共享JSON中的一部分数据并从中重新创建CoreData实体可能比共享整个图形更安全、更容易

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

  • 谢谢你,安迪。1.该应用程序确实可以查看版本并从中更新数据。您是否担心具有早期版本的用户会尝试使用更高版本的数据进行恢复?2.我没有让用户通过iCloud共享—只是将备份存储在那里。但是,用户可以通过iCloud备份创建带有备份附件的电子邮件。我可能打算使用iCloud文档(而不是CloudKit)。听起来不错吧。是的,较早版本的用户可能从较新版本中选择存储。新得多的应用程序也可能会选择一家非常旧的商店。只要您可以进行轻量级迁移或运行渐进式迁移,您就应该可以了。至于在旧的应用程序中使用更新的商店,我打赌这是不可能的,因为应用程序不知道如何处理它。云文档应该可以正常工作。NSMetadataQuery可以帮助您监视或搜索容器中的文件,即使这些文件在磁盘上不可用。使用NSFileCoordinator可以更好地从iCloud文档容器复制文件。使用它是很痛苦的,但若你们从容器中复制它,那个么它应该可以正常工作。NSFileManager.setUbiouse是一个很好的快捷方式,但它实际上会移动文件,当您希望从iCloud恢复核心数据存储时,可能需要从iCloud复制