未保存的托管对象上下文对包含NONE或ANY的谓词产生异常



我想执行一个取回请求:

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;
}

似乎有一个问题,数据库内部的工作方式不同,如果上下文不保存更改后。

可能我做错了什么(通过变通来修复),但这种方法修复了我的崩溃。希望对大家有所帮助。

最新更新