繁体   English   中英

核心数据NSInvalidArgumentException错误

[英]Core Data NSInvalidArgumentException Error

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

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

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

希望这会有所帮助。

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

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

删除任何问题后,问题就解决了。 感谢上帝为院长! 刚刚从故障排除和头痛中解脱了几个小时。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM