核心数据错误与异常第 3 部分

Posted

技术标签:

【中文标题】核心数据错误与异常第 3 部分【英文标题】:Core Data Errors vs Exceptions Part 3 【发布时间】:2010-04-16 13:38:06 【问题描述】:

我的问题类似于this one。

背景

我正在使用 NSOperations 在核心数据存储中创建大量对象以加快速度。

我已遵循所有 Core Data 多线程规则 - 我有一个持久存储协调器和一个托管对象上下文,每个线程在保存时合并回主托管对象上下文。

问题

当一次运行的线程数超过 1 时,我在保存我的核心数据存储时收到异常记录:

NSExceptionHandler has recorded the following exception:
NSInternalInconsistencyException -- optimistic locking failure

我的尝试

我创建新实体的代码非常复杂 - 它使实体与可能在单独线程中创建的其他实体有关系。

如果我用一些非常简单的代码替换我的对象创建例程,只是创建不相关的条目,那么一切都会完美运行。

最初,除了例外,我收到一个保存错误,说核心数据由于合并失败而无法保存。

我阅读了文档并意识到我需要一个关于我保存到的托管对象上下文的合并策略。我设置了这个,正如this question 所说,保存错误消失了,但异常仍然存在。

我的问题

我需要担心这些异常吗?如果我确实需要摆脱这些异常,有什么想法可以解决吗?

【问题讨论】:

【参考方案1】:

您需要捕获该异常,然后打印出与其相关的所有信息以确定确切原因。异常在 Core Data 中非常罕见,绝对不应该被忽略。

但是您没有向我们提供足够的信息来帮助您追踪它,因此第一步是展开该异常并查看发生了什么。

【讨论】:

【参考方案2】:

Cocoa 中的异常表明发生了非常糟糕的事情,最好尽快退出。一般来说,Cocoa 使用返回值和输入参数来传达错误条件。

您是否正在为新线程创建一个新的NSManagedObjectContext? Apple 文档Multi-Threading with Core Data 提供了使用 Core Data 进行多线程处理的指南。建议:

创建一个单独的托管对象 每个线程的上下文并共享一个 单个持久存储协调器。

【讨论】:

感谢您的评论本尼迪克特。我已经用更多细节更新了我的问题。我已经非常仔细地研究了核心数据多线程指南,并花了很多时间确保使用简单的实体创建算法,NSOperations 可以完美运行。我想知道解决方案是否是以不同的方式进行对象创建...

以上是关于核心数据错误与异常第 3 部分的主要内容,如果未能解决你的问题,请参考以下文章

PHP 核心特性 - 错误处理

python核心编程学习记录之错误与异常

Java核心技术卷阅读随笔--第7章异常断言和日志

无法保存核心数据

CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获到异常

Python核心异常处理