我的应用程序通过 iCloud 同步和备份其数据(为此目的,我使用 iCloudCoreDataStack)。当我的应用程序处理用户创建的重要数据时,我希望通过不时创建快照的能力来提供额外的安全网,以便稍后恢复。
我不是在谈论撤消一两个单独的更改,而是在谈论真实的快照,带有时间戳并以保存方式存储。
由于我正在利用 iCloud 同步,因此我不能简单地交换应用程序中使用的 sqlite 存储。我想我必须删除当前上下文中的每个对象,创建从快照恢复的对象并保存上下文。然后,设备也会将更改推送到 iCloud。
我正在考虑以下场景:
- 应用程序可以正常运行,无需选择创建快照(这只是用户可选的安全功能)。
- 如果用户选择不时创建快照,系统会要求他输入 Dropbox 登录凭据(已实现)。
- 有时,我的应用程序会创建一个后台线程,其中将设置第二个商店和第二个 MOC(以及第二个 PSC?)。每个对象及其关系都被复制到第二个 MOC 中。第二个 MOC 被保存,持久存储将被复制到 Dropbox,线程将结束。
- 如果用户想要恢复快照并放弃创建快照后所做的所有更改,我的应用将通过反向执行第 3 点中所述的操作来重建数据。
有什么想法吗?这是要保存的吗?有什么注意事项需要考虑吗(尤其是与 iCloud 一起)?有人以类似的方式做到过吗?
编辑:
按照上述步骤,我成功创建了商店的副本。在一些初步尝试中,商店的娱乐似乎也奏效了。但是,我仍然担心加载商店文件的方式(将旧文件拉走,然后用我保存的文件替换)。
但是,我遇到过 Apple 的“另存为...”或“重新定位”方法
NSDictionary *options = @{
NSPersistentStoreRemoveUbiquitousMetadataOption: @YES
};
NSPersistentStore *copy = [psc migratePersistentStore:currentiCloudStore
toURL:url
options:options
withType:NSSQLiteStoreType
error:&error];
这将删除所有与 iCloud 相关的元数据,还会从协调器中删除当前存储(我不希望这样),并将新创建的存储添加到 PSC(我也不希望这样)。
更好的方法是什么?我当前的方法还是苹果内置的“另存为.../重新定位”?我的重点是稍后加载快照,无论 iCloud 是否启用。
最佳答案
我觉得你的基本方法很好。我还使用 iCloudCoreDataStack,我认为这是一个强大的解决方案。
如果您想保存新商店,我不明白为什么您要遍历所有对象并重新创建它们。只需保存所有内容,锁定商店,制作本地副本,解锁商店(用户现在可以继续工作),然后将商店复制到 DropBox。恢复时,用下载的商店覆盖现有商店(如果在同一设备上且沙箱仍然存在,则无需下载)。此时您可能还需要重置 iCloud 商店。
话虽这么说,如果您已经在迭代对象图,您可能会用它来做一些额外的事情,这些事情可能会变得有用。您可以将整个对象图转换为 JSON 并将其存储为文本文件(如果没有可转换或二进制属性)。您的数据现在可供人类通过更多方式和更多平台读取和使用。
关于core-data - 支持 iCloud 的 Core Data 应用程序中的数据快照?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20782572/