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

时间:2011-09-21 09:58:13

标签: ios exception core-data predicate nsmanagedobjectcontext

我想执行获取请求:

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。'

如果我在执行之前保存上下文,则按预期工作。关于这个原因的任何想法?

注意:导入捆绑数据时,在应用程序启动时会发生这种情况。

1 个答案:

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

似乎数据库中存在一个问题,如果在更改后没有保存上下文,则工作方式会有所不同。

可能我做错了(通过解决方法修复它)但这种方法解决了我的崩溃。希望它能帮助别人。