Моя ситуация проста: у меня есть несколько записей в моем основном хранилище данных. Один из их атрибутов - строка с именем «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
Он не нашел решения или.
Черт возьми! Я в тупике.
Спасибо!