Несохраненный контекст управляемого объекта создает исключение для предиката, содержащего NONE или ANY - PullRequest
2 голосов
/ 21 сентября 2011

Я хотел бы выполнить запрос на выборку:

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 голосов
/ 13 июля 2013

У меня та же проблема.У меня есть большой предикат, состоящий из предикатов (с ЛЮБОЙ внутри), и после удаления подкаталога «ЛЮБОЙ» я не получаю никаких сбоев.

И как сохранить контекст, если вы используете автосохранение через 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;
}

Похоже, что существует проблема внутри базы данных, которая работает по-другому, если контекст не сохраняется после изменений.

Возможно, я что-то делаю не так (исправляю это обходным путем), но этот подход исправил мой сбой.Надеюсь, это поможет другим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...