【问题标题】: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],因为您永远不应该说永远。
        但在您这样做之前,您应该询问用户是否想向您发送错误日志。因为保存永远不应该失败。

        【讨论】:

          猜你喜欢
          • 2016-12-14
          • 2018-02-20
          • 1970-01-01
          • 1970-01-01
          • 2015-12-13
          • 2022-12-09
          • 2013-06-06
          • 1970-01-01
          • 2011-02-15
          相关资源
          最近更新 更多