NSManagedObjectContext -save:使用 NSPredicate 时崩溃

Posted

技术标签:

【中文标题】NSManagedObjectContext -save:使用 NSPredicate 时崩溃【英文标题】:NSManagedObjectContext -save: crashes when using NSPredicate 【发布时间】:2013-09-17 09:52:18 【问题描述】:

我的应用中有一个搜索栏和一些过滤器,它们创建了两个谓词。一个用于搜索栏中的字符串,一个用于过滤器 (UISegmentedControl)。

当使用谓词并在上下文中插入一个对象然后调用-save: 时,应用程序崩溃:

CoreData: error: Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  Can't use in/contains operator with collection 1379410732 (not a collection) with userInfo (null)

在保存点:

不使用谓词时不会发生这种情况。 我可以在保存过程中以某种方式删除谓词吗?我已经通过获取NSFetchRequest 进行了尝试,但我无法将其设置回控制器。

编辑

我还尝试将self 添加为NSManagedObjectContextDidSaveNotification 上的观察者,然后使用-mergeChangesFromContextDidSaveNotification: 就像关于SO 的一次讨论所建议的那样。这也没有帮助。

【问题讨论】:

也许显示谓词? 谢谢马丁,我刚刚发现了问题。该解决方案仍有一个令人困惑的部分,但崩溃已修复。你是对的,它是谓词。 【参考方案1】:

我发现了我的问题。这很容易,但是错误消息太混乱了,以至于我没有看对点。

问题是我使用的是[NSPredicate predicateWithFormat:@"number CONTAINS[cd] %@", string]

所以谓词在NSNumber 上使用CONTAINS。令人困惑的部分是谓词在从数据库中查询现有数据时起作用。我仍然不明白这部分,但它现在可以与== 比较器一起使用。

【讨论】:

以上是关于NSManagedObjectContext -save:使用 NSPredicate 时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObjectContext:撤消保存操作?

声明 NSManagedObjectContext 时出错

CoreData 多 NSManagedObjectContext 保存通知说明

NSManagedObjectContext 类别

NSManagedObjectContext: performBlockAndWait vs performBlock 通知中心

如何清除 NSManagedObjectContext 中的所有对象?