【问题标题】:how to handle error when saving managedObjectContext?保存 managedObjectContext 时如何处理错误?
【发布时间】:2011-07-09 05:57:43
【问题描述】:
如果在执行 -[NSManagedObjectContext save:] 时出错,恢复到现有持久存储的适当策略是什么?
-[NSManagedObjectContext 回滚]?
或者我应该在尝试保存之前在文件系统上保存存储的副本:然后,如果出现错误,使用 -[NSPersistentStoreCoordinator setURL:forPersistentStore:] 将存储设置为已保存的存储?
感谢您的任何指点。
贡萨洛
【问题讨论】:
标签:
iphone
ipad
ios
core-data
【解决方案1】:
我相信,虽然我没有在文档中看到明确的说明,但如果在保存过程中发生错误,则保存失败并且数据存储将保持不变。您可以通过复制数据存储、强制出现某种错误,然后将存储与副本进行比较来轻松验证这一点。
【解决方案2】:
NSManagedContext 保存返回一个 BOOL,如果成功则返回 YES,否则返回 NO。这将确定数据存储是否已实际更改。
另一件事:
查看 Apple 的“Core Data Programming Guide: Persistent Store Features”,在“Configuring a SQLite Store’s Save Behavior”下。他们提供了一个完整的示例,说明如何为商店设置完全同步选项,以确保不会因保存过程中的某些中断而导致数据损坏。
【解决方案3】:
当保存失败时,您(作为程序员)做错了什么。
我编写了一些非常复杂的 Core-Data 应用程序,并且从未在生产环境中看到失败的保存。
确保用户可以输入的值可以正确保存。
这意味着,如果您有一个非可选关系,则在用户为该关系选择实体之前不要接受“完成”按钮。或者设置一个默认的关系实体。
如果您需要特殊格式的 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],因为您永远不应该说永远。
但在您这样做之前,您应该询问用户是否想向您发送错误日志。因为保存永远不应该失败。