在本地备份核心数据,并从备份恢复–Swift
我很难找到有关创建核心数据备份的任何信息。 我的最终目标是允许用户创建多个备份,并从选定的备份进行还原。
我找到了一个示例项目,允许您在本地或通过Objective-C中的iCloud进行备份/恢复,但没有任何内容在swift中。
有人可以帮忙吗? 或者指出我正确的方向。 我甚至不知道从哪里开始。
我从来不需要这样做,但如果我这样做,那就是我要做的。
进行备份
您可以随时使用以下步骤:
- 创建一个新的第二个核心数据堆栈。 使用
NSPersistentContainer
或较旧(但仍支持)的方法来创建NSPersistentStoreCoordinator
。 - 使用
NSPersistentStoreCoordinator
的函数migratePersistentStore(_:to:options:withType:)
来创建备份。 使用UUID或时间戳使目标URL包含唯一的内容。 将备份放在文档文件夹中。 - 按日期保留备份列表。 您可以将其放入
UserDefaults
或创建新的属性列表文件以保存备份信息。
步骤#2将从Core Data堆栈中删除原始存储 – 这就是您在步骤#1中创建第二个堆栈的原因。 这样,您可以使用第二个堆栈进行备份,而不会影响您的应用正在使用的备份。
如果您正在使用NSPersistentContainer
,请使用其persistentStoreCoordinator
属性执行步骤#2。
从备份还原
这有点棘手,因为您的应用可能正在使用其持久性存储,但现在您想要用旧版本替换它。 在从备份还原之前,请确保您当前没有使用持久性存储中的任何托管对象。 取消NSPersistentContainer
您的NSPersistentContainer
。 卸载任何使用托管对象的UI。 让您的应用程序进入一种状态,它可以做的就是从备份还原或返回使用当前数据,但除了备份列表之外它没有显示任何数据。
既然你已经这样做了,
- 显示备份列表,让用户选择一个。
- 使用数据模型创建
NSPersistentStoreCoordinator
。 - 使用
replacePersistentStore(at:destinationOptions:withPersistentStoreFrom:sourceOptions:ofType:)
方法将备份数据复制到普通的应用程序位置。 起始位置是备份位置,目标是应用程序通常保存其数据的位置。 - (可选)使用
NSPersistentStoreCoordinator
的函数destroyPersistentStore(at:ofType:options:)
删除备份。 - 像往常一样加载
NSPersistentContainer
并重新加载常规应用UI。
不要使用像FileManager
这样的直接文件相关API来实现这一点。 核心数据方法将涵盖所有与核心数据相关的文件,并执行其他一些好处,例如避免导致数据损坏和尊重文件锁定。
更多有价值的想法只是我的两分钱:要解决这个问题,我会尝试使用CloudKit创建不同的客户区域,以便在iCloud的App用户私有数据库中从核心数据中存储不同的备份。