NSPredicate не возвращает результатов с запросом на выборку, работает с массивом Фильтрация

Моя ситуация проста: у меня есть несколько записей в моем основном хранилище данных. Один из их атрибутов - строка с именем «localId». Есть момент, когда я хотел бы найти запись с определенным значением localId. Очевидный способ сделать это - использовать NSFetchRequest и NSPredicate. Однако, когда я это установил, запрос возвращает ноль записей.

Если, однако, Я использую запрос на выборку без предиката, возвращая все записи, и просто перебираю их, ища целевое значение localId, я нахожу запись, которую ищу. Другими словами, запись есть, но запрос выборки не может ее найти.

Мои другие методы, в которых я использую запросы и предикаты выборки, работают должным образом. Я не знаю, почему это не удается.

Я хочу сделать это:

- (void)deleteResultWithLocalID:(NSString *)localId {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
    [request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]];
    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
    if ([results count]) [context deleteObject:[results objectAtIndex:0]];
    else NSLog(@"could not find record with localID %@", localId);
    [self saveContext];
}

Но в конечном итоге мне приходится делать следующее:

- (void)deleteResultWithLocalID:(NSString *)localId {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]];
    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:request error:&error];
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error]));
    for (WCAAssessmentResult *result in results) {
        if ([result.localId isEqualToString:localId]) {
            NSLog(@"result found, deleted");
            [context deleteObject:result];
        }
    }
    [self saveContext];
}

Есть какие-нибудь подсказки относительно того, что может пойти не так?

редактировать

Я обнаружил, что могу использовать созданный мной предикат для получения ожидаемых результатов после выполнения запроса на выборку. Итак, следующее также работает:

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId {
     NSFetchRequest *request = [[NSFetchRequest alloc] init];
     [request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]];
     NSArray *foundRecords = [context executeFetchRequest:request error:nil];
     foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]];
     if ([foundRecords count]) {
         return [foundRecords objectAtIndex:0];
     } else {
         NSLog(@"can't find checklist item with id %@", itemId);
         return nil;
    }
}

ОБНОВЛЕНИЕ

Я столкнулся с кем-то, у кого возникла эта проблема:

http://markmail.org/message/7zbcxlaqcgtttqo4

Он не нашел решения или.

Черт возьми! Я в тупике.

Спасибо!

8
задан CharlieMezak 24 March 2011 в 11:50
поделиться