我想执行一个取回请求:
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。'
如果我在执行之前保存上下文,则所有工作都如预期的那样。对此有什么想法吗?
我也有同样的问题。我有大谓词组成的子谓词(与任何内部),并删除"任何"子谓词后,我没有得到任何崩溃。
和如何保存上下文,如果你使用自动保存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;
}
似乎有一个问题,数据库内部的工作方式不同,如果上下文不保存更改后。
可能我做错了什么(通过变通来修复),但这种方法修复了我的崩溃。希望对大家有所帮助。