Извлекать один объект из NSFetchRequest

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

NSFetchRequest *request= [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]];
[request setEntity:entity];
[request setPredicate:predicate];
NSError *error;
NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
3 ответа

Если ваш предикат всегда получает более одного результата:

  • уточнить предикат - не забывайте, что вы можете строить предикаты с логикой типа AND/OR, простое равенство легко, но может быть недостаточно избирательным в вашем случае.

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

  • рассмотрите возможность реорганизации вашей модели данных, чтобы вы могли уточнить предикат, чтобы вернуть только один элемент.

Возврат всегда возвращает массив, то есть его определение. Однако это может быть массив одного объекта.


Он всегда будет возвращать массив, но вы можете сделать его более чистым:

NSFetchRequest *request= [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Manufacturer" inManagedObjectContext:managedObjectContext];
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"ManufacturerID==%@",[[mitems objectAtIndex:i] objectForKey:@"ManufacturerID"]];
[request setEntity:entity];
[request setPredicate:predicate];
NSError *error;
//Making a mutable copy here makes no sense. There is never a reason to make this mutable
//NSArray *entities = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
id manufacturer = [[managedObjectContext executeFetchRequest:request error:&error] lastObject];
request = nil;
NSAssert1(error && !manufacturer, @"Error fetching object: %@\n%@", [error localizedDescription], [error userInfo]);

-lastObject вернет последний элемент в массиве или nil, если массив пуст. Это немного снижает ваш код, если вы знаете, что в массиве будет один объект, или вам не важно, какой объект вы выберете из массива.

Кстати, ваши имена свойств должны начинаться с строчной буквы. Я удивлен, что компилятор не предупредил вас об этом.


Попробуйте fetchRequest.fetchLimit = 1. Вы по-прежнему получаете массив, но не более 1 объекта.

licensed under cc by-sa 3.0 with attribution.