如果在执行 - [NSManagedObjectContext save:]时出现错误,还原到现有持久存储的适当策略是什么?
- [NSManagedObjectContext rollback]?
或者我应该在尝试保存之前在文件系统上保存商店的副本:然后,如果出现错误,请使用 - [NSPersistentStoreCoordinator setURL:forPersistentStore:]将商店设置为已保存的商店?
感谢您的任何指示。
的Gonzalo
答案 0 :(得分:10)
当保存失败时(作为程序员)做错了。
我写了一些非常复杂的核心数据应用程序,从未在生产中看到过失败的保存。
确保用户可以输入的值可以保存而不会出错。
这意味着如果您具有非可选关系,则在用户为此关系选择实体之前,不接受“完成”按钮。或者设置默认关系实体 如果您需要特殊格式的NSString,请在接受之前验证该字符串。
对用户来说也更方便。如果你告诉他10 minutes ago you did something wrong, thats why I will delete all your changes
他会想WTF?
。如果你告诉他The value you try to enter is not in the correct format. Please use xxxxx
他会认为Ok, let's change it.
现在确定保存永不失败后,您可以将[context rollback]
放入其中,因为您永远不应该说永远不会。
但在此之前,您应该询问用户是否要向您发送错误日志。因为保存永远不会失败。
答案 1 :(得分:0)
我相信,虽然我没有在文档中看到它明确写入,但如果在保存期间发生错误,则保存失败并且数据存储将保持不变。您可以通过复制数据存储,强制某种错误,然后将存储与副本进行比较来轻松验证这一点。
答案 2 :(得分:0)
NSManagedContext save返回BOOL,如果成功则返回YES,否则返回NO。这将告诉您确定数据存储是否实际已被更改。
另一件事: 在“配置SQLite存储的保存行为”下查看Apple的“核心数据编程指南:持久存储功能”。它们提供了如何为存储设置完整同步选项的完整示例,以确保在保存过程中由于某些中断而导致数据损坏。