核心数据NSInvalidArgumentException错误

时间:2011-08-18 22:45:00

标签: iphone objective-c cocoa-touch core-data crash

我在更改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.'

3 个答案:

答案 0 :(得分:7)

警告:此答案基于我根据错误消息做出的猜测;它可能是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];

答案 1 :(得分:3)

我认为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 ...这暗示必须存在一对多的关系。

希望这有帮助。

答案 2 :(得分:0)

只是一个FYI。在我的案例中,deanWombourne的回答是100%正确的。

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

删除ANY后问题解决了。感谢上帝为院长!刚从故障排除和头痛中拯救了我。