【发布时间】:2014-01-13 23:25:25
【问题描述】:
我的应用通过 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(我也不希望这样做)。
什么是更好的方法?我当前的方法还是 Apples 内置的“另存为.../重新定位”?我的重点是稍后加载快照,无论是否启用/启用了 iCloud。
【问题讨论】: