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

标签 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。”

如果我在执行前保存上下文,则所有操作均按预期进行。关于这个原因有什么想法吗?

注意:这是在导入捆绑数据时在应用程序启动时发生的。

最佳答案

我有同样的问题。
我有一个包含子谓词(内部包含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/

相关文章:

iphone - 动画不适用于 iPad。在iphone上同样有效

java - 如果我在异常上调用 getCause(),为什么我必须处理 Throwable

json - Spark对json的异常处理

iphone - 直接从 NSFetchedResultsController 获取

ios - Swift 隐藏导航标题,但在下一个 View Controller 中将其标题显示为后退按钮

ios - 使用 dispatch_async() 时 Swift 中的 Optionals 问题

iphone - 裁剪后的图像在iPhone中放大了吗?

c++ - 抛出 std::out_of_range 异常。 "expected type-specifier"

ios - 使用带 NSBatchDeleteRequest 的 NSFetchedResultsController

ios 应用程序崩溃,没有错误,也没有崩溃报告