我想执行获取请求:
NSFetchRequest *fetchRequest = [NSFetchRequest new];
[fetchRequest setIncludesPendingChanges:YES];
NSSet *set = [NSSet setWithObjects:@"TESTNAME",@"TEST", nil];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"NONE name IN %@", set]];
在未保存的NSManagedObjectContext上执行请求时,应用程序终止,但异常:
* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因是:'ALL或ANY运算符的左侧必须是NSArray或NSSet。'
如果我在执行之前保存上下文,则按预期工作。关于这个原因的任何想法?
注意:导入捆绑数据时,在应用程序启动时会发生这种情况。
答案 0 :(得分:0)
我遇到了同样的问题。 我有一个由子谓词组成的大谓词(在内部有任何内容),在删除“任何”子预测后,我没有遇到任何崩溃。
如果您通过UIManagedDocument使用自动保存,如何保存上下文?
----已编辑----
只需将try / catch和谓词重新初始化即可解决问题:
+ (NSArray *)productsByColorName:(NSString *)name {
NSManagedObjectContext *context = [DatabaseController sharedInstance].database.managedObjectContext;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:[[self class] tableName]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY %K =[cd] %@", @"color.name", name];
request.predicate = predicate;
NSError *error = nil;
NSArray *matches = nil;
@try {
matches = [context executeFetchRequest:request error:&error];
} @catch (NSException *ex) {
NSLog(@"Exception: %@", [ex reason]);
predicate = [NSPredicate predicateWithFormat:@"%K =[cd] %@", @"color.name", name];
request.predicate = predicate;
matches = [context executeFetchRequest:request error:&error];
}
return matches;
}
似乎数据库中存在一个问题,如果在更改后没有保存上下文,则工作方式会有所不同。
可能我做错了(通过解决方法修复它)但这种方法解决了我的崩溃。希望它能帮助别人。