核心数据 NSInvalidArgumentException 错误

Posted

技术标签:

【中文标题】核心数据 NSInvalidArgumentException 错误【英文标题】:Core Data NSInvalidArgumentException Error 【发布时间】:2011-10-30 05:04:41 【问题描述】:

更改 NSManagedObject 的 BOOL 属性时发生崩溃。

保存对象的代码是:

self.detailItem.bookmark = [NSNumber numberWithBool:YES];
NSError *error = nil;
if (!    [self.detailItem.managedObjectContext save:&error]) 

    // Handle the error.

NSLog(@"%@", error);

还有错误:

Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet. with userInfo (null)
2011-08-18 15:41:32.866 Codes[5260:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The left hand side for an ALL or ANY operator must be either an NSArray or an NSSet.'

【问题讨论】:

您需要添加更多代码 - 您的 detailItem 是什么样的;它只是一个 NSManagedObject 吗? 是的,detailItem 只是一个 NSManagedObject,带有一个名为 bookmark 的 BOOL 属性。 【参考方案1】:

警告:此答案基于我根据错误消息做出的猜测;这可能是 100% 错误的!


该错误看起来像是格式不正确的NSPredicate。你可能有类似的东西

NSString *name = @"Bob";
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", name];

看起来它可能会在name = 'Bob' 找到任何东西,但它不会,它会抛出异常:(

如果您使用“IN”,则需要传递 NSSet 或 NSArray,即 .

NSArray *names = [NSArray arrayWithObjects:@"Alice", @"Bob", nil];
[NSPredicate predictaeWithFormat:@"ANY %K IN %@", @"name", names];

这将找到名称为“Bob”或“Alice”的任何内容。

如果您只想搜索“Bob”,请执行以下操作:

NSString *name = @"Bob";
[NSPredicate predictaeWithFormat:@"%K == %@", @"name", name];

【讨论】:

此 VC 中没有谓词。但是我有单独的 VC 有这个谓词 [NSPredicate predicateWithFormat:@"ANY bookmark == YES"]; 那里有什么问题吗? 该错误意味着它是其他一些对您的托管对象的更改感兴趣的对象导致异常,因此它可能是那个谓词。不带“ANY”试试看会发生什么? 试过了,但还是崩溃了。对于我们正在使用的 VC,这就是我与对象相关的所有代码,对象是从父视图推送的。我没有任何 MOC 代码,因为对象应该拉动 MOC 本身。 它是谓词,因为"ANY bookmark == YES" 无效。崩溃是由破坏对象图的谓词引起的,直到您保存上下文才变得明显。保存错误不必与保存之前的代码相关。在保存操作之前,上下文中累积的任何错误都可能不明显。 您的假设对于我从 CoreData 获得完全相同的错误的情况是正确的。删除不正确的谓词会消除崩溃。【参考方案2】:

我认为 deanWornbourne 写了正确的答案,但对我来说不是很清楚,所以我将重申他的答案和见解,并提供进一步的解释。

ProgramGuy 遇到严重的应用程序错误,因为他的谓词错误。 ANY bookmark == YES 错误的原因是“ANY”仅用于模型中存在一对多关系的情况。当你有一对一的关系时,你应该使用bookmark == YES

“严重的应用程序错误”听起来有点傻,并且引起了不必要的警报。但是,它为您提供了一个很好的错误线索。它说有一个“观察者内部的错误......”。这意味着您有一些“NSFetchedResults”对象或“NSFetchedResultsController”设置(因为我们正在谈论NSManagedObjectContextObjectChangedNotification)。此外,错误消息显示left hand side for an ALL or ANY operator must be either an NSArray... 这暗示必须存在一对多关系。

希望对您有所帮助。

【讨论】:

【参考方案3】:

仅供参考。就我而言,deanWombourne 的回答是 100% 正确的。

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTeamSchedule" inManagedObjectContext:[[MyTeamStore sharedStore] context]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY myteam.teamname == %@", myTeamName];

删除 ANY 后问题就解决了。感谢上帝的院长!只是让我免于数小时的故障排除和头痛。

【讨论】:

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

大数据核心技术都有哪些

哪里不使用核心数据?是不是可以将核心数据用作 MySql 之类的数据库?

使用 MKMapView、核心位置和核心数据

大数据三大核心技术:拿数据、算数据、卖数据!

核心数据道模式

通过迁移将核心数据实体及其数据移动到新的核心数据模型文件中