【问题标题】:Core Data crash when saving with error : _Unwind_Resume called from function -[NSSQLCore performChanges] in image CoreData保存错误时核心数据崩溃:_Unwind_Resume 从图像 CoreData 中的函数 -[NSSQLCore performChanges] 调用
【发布时间】:2011-03-04 18:12:57
【问题描述】:

我有点卡在这个核心数据错误上。我在应用程序上的基本设置是在初始化时加载一些基本数据。让我们称他们为部门和员工。在初始化时,我只会加载与应用当前用户相关的部门和员工。

然后用户可以搜索其他部门和/或员工。例如,当他们搜索艺术部门时,服务器会返回该部门的前 20 名员工。该代码将新部门存储到核心数据中,并将员工存储到核心数据中。我正在使用 2 个线程,一个用于将数据存储到上下文中的实际工作,另一个用于在 GUI 上显示数据。我使用 mergeChangesFromContextDidSaveNotification 方法来合并更改。

部门的存储总是有效的,但是行:

BOOL ok = [importContext save:&errorSave];

总是会导致 _unwind_resume 错误。我接受了here 的建议。在 Objective C 异常上打开停止。我看到了这个调用堆栈。

#0  0x030203f4 in objc_exception_throw ()
#1  0x0253d921 in -[NSSQLiteConnection updateRow:] ()
#2  0x0253c6b4 in -[NSSQLConnection performAdapterOperations:] ()
#3  0x0253c35e in -[NSSQLCore _performChangesWithAdapterOps:] ()
#4  0x0253ae3a in -[NSSQLCore performChanges] ()
#5  0x02534778 in -[NSSQLCore saveChanges:] ()
#6  0x024f27c9 in -[NSSQLCore executeRequest:withContext:error:] ()
#7  0x025a134b in -[NSPersistentStoreCoordinator executeRequest:withContext:error:] ()
#8  0x0252b088 in -[NSManagedObjectContext save:] ()

这并没有给我任何关于保存导致此异常的原因的线索。

我通过在保存前打印出来查看了我试图保存的数据,它看起来没问题。通常有 1 或 2 名员工已经导入,并更新(根据需要),并插入其他员工。导入上下文似乎正确地看到了这一点。

我还检查以确保数据模型没有无效的非可选属性。

我认为问题可能是由于线程造成的,所以我将所有内容都移到了同一个线程,只是为了检查。不,问题仍然存在。

所以现在,我有点不知道下一步该尝试什么?任何建议将不胜感激。

【问题讨论】:

  • 两个建议(但不值得作为“答案”发布):(1)尝试使用 NSXMLStoreType 而不是 NSSQLiteStoreType - 只是为了看看你得到什么样的堆栈跟踪。 (2) 使用 NSZombieEnabled 来查看是否过度释放了作为保存的一部分的 NSManagedObject。
  • 这是整个错误消息还是它还抱怨缺少符号?
  • 我已经开启了僵尸追踪,并且没有关于过度释放对象的投诉。我会试试 XMLStore 看看它是否有所作为。
  • 这是整个消息:“检测到尝试调用 iPhone 上不存在的系统库中的符号:_Unwind_Resume 从函数调用 - [NSSQLCore performChanges] in image CoreData。”

标签: iphone core-data


【解决方案1】:

我很确定_Unwind_Resume 是异常处理堆栈的一部分。所以,实际上它告诉你的只是发生了系统无法处理的异常。

我会评论您对 managedObjects 的任何保留和释放,尤其是您可能标记为 autorelease 的任何保留和释放。管理不善的版本可能会导致未保存的 managedObject 从对象图中消失,从而创建 w

【讨论】:

    【解决方案2】:

    好吧,看起来很奇怪,我认为问题在于数据模型和实际数据中的类型不匹配。在数据模型中,我错误地将其中一个字段定义为 Int32,实际上它应该是一个浮点数。

    虽然我不完全明白为什么第一次保存它总是有效,但第二次尝试保存时,我得到了上述错误。

    随着数据类型的改变,现在多次保存可以正常工作。

    希望错误消息不那么不透明!

    【讨论】:

      猜你喜欢
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多