在本地备份核心数据,并从备份恢复–Swift

我很难找到有关创建核心数据备份的任何信息。 我的最终目标是允许用户创建多个备份,并从选定的备份进行还原。

我找到了一个示例项目,允许您在本地或通过Objective-C中的iCloud进行备份/恢复,但没有任何内容在swift中。

有人可以帮忙吗? 或者指出我正确的方向。 我甚至不知道从哪里开始。

我从来不需要这样做,但如果我这样做,那就是我要做的。

进行备份

您可以随时使用以下步骤:

  1. 创建一个新的第二个核心数据堆栈。 使用NSPersistentContainer或较旧(但仍支持)的方法来创建NSPersistentStoreCoordinator
  2. 使用NSPersistentStoreCoordinator的函数migratePersistentStore(_:to:options:withType:)来创建备份。 使用UUID或时间戳使目标URL包含唯一的内容。 将备份放在文档文件夹中。
  3. 按日期保留备份列表。 您可以将其放入UserDefaults或创建新的属性列表文件以保存备份信息。

步骤#2将从Core Data堆栈中删除原始存储 – 这就是您在步骤#1中创建第二个堆栈的原因。 这样,您可以使用第二个堆栈进行备份,而不会影响您的应用正在使用的备份。

如果您正在使用NSPersistentContainer ,请使用其persistentStoreCoordinator属性执行步骤#2。

从备份还原

这有点棘手,因为您的应用可能正在使用其持久性存储,但现在您想要用旧版本替换它。 在从备份还原之前,请确保您当前没有使用持久性存储中的任何托管对象。 取消NSPersistentContainer您的NSPersistentContainer 。 卸载任何使用托管对象的UI。 让您的应用程序进入一种状态,它可以做的就是从备份还原或返回使用当前数据,但除了备份列表之外它没有显示任何数据。

既然你已经这样做了,

  1. 显示备份列表,让用户选择一个。
  2. 使用数据模型创建NSPersistentStoreCoordinator
  3. 使用replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType:)方法将备份数据复制到普通的应用程序位置。 起始位置是备份位置,目标是应用程序通常保存其数据的位置。
  4. (可选)使用NSPersistentStoreCoordinator的函数destroyPersistentStore(at:ofType:options:)删除备份。
  5. 像往常一样加载NSPersistentContainer并重新加载常规应用UI。

不要使用像FileManager这样的直接文件相关API来实现这一点。 核心数据方法将涵盖所有与核心数据相关的文件,并执行其他一些好处,例如避免导致数据损坏和尊重文件锁定。

更多有价值的想法只是我的两分钱:要解决这个问题,我会尝试使用CloudKit创建不同的客户区域,以便在iCloud的App用户私有数据库中从核心数据中存储不同的备份。