我想执行提取请求:
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。”
如果我在执行前保存上下文,则所有操作均按预期进行。关于这个原因有什么想法吗?
注意:这是在导入捆绑数据时在应用程序启动时发生的。
最佳答案
我有同样的问题。
我有一个包含子谓词(内部包含ANY)的大谓词,并且删除“ANY”子谓词后,我没有崩溃。
以及如何通过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;
}
似乎数据库内部存在一个问题,如果更改后未保存上下文,则该问题的工作方式有所不同。
可能是我做错了(通过解决方法解决),但是这种方法解决了我的崩溃问题。希望它会帮助其他人。
关于ios - 未保存的管理对象上下文对包含NONE或ANY的谓词产生异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497919/