1

我一直在寻找正确的方法来创建由 Core-Data 支持的 .sqlite 文件的备份并将该备份存储在本地和/或 iCloud(无论用户喜欢什么)中,以供下载、恢复或分享。让我先声明一下,我不是在谈论将持久存储移动到 iCloud 以供应用程序用作其数据源。我只是在询问有关在此问题中创建备份文件的问题。

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

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

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

要安全地备份和恢复 Core Data SQLite 存储,您可以执行以下操作:使用 NSPersistentStoreCoordinator 类的以下方法,而不是文件系统 API,来备份和恢复 Core Data 存储:- (NSPersistentStore *)migratePersistentStore:( NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

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

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

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

4

1 回答 1

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

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

也许在 JSON 中共享部分数据并从中重新创建 CoreData 实体将是共享数据的更安全和更容易的策略,而不是共享整个图。

  1. 您只能将文件复制到 iCloud 容器中并跨设备共享,但您不能真正直接从容器中使用它或通过 iCloud 进行增量更新。NSFileManagersetUbiquitous允许将文件移动到 iCloud 容器中。
于 2017-11-30T19:52:11.977 回答