2010-08-10 3 views
6

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

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]; 
+0

[request setFetchLimit: 1] может ограничить количество возвращаемых объектов, хотя вы все равно будете получать NSArray. – magma

ответ

8

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

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

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

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

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

+0

хорошо, тогда то, что я получил, прекрасно работает :) Спасибо за разъяснение, мой ManufacturerID всегда будет уникальным, поэтому я должен быть настроен. – Slee

6

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

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 возвращает последний элемент в массиве или ноль, если массив пуст. Это держит ваш код немного чище, если вы знаете, что в массиве будет один объект, или вам не важно, какой объект вы выберете из массива.

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

+0

поэтому вместо mutableCopy, когда я хочу, чтобы все элементы в массиве я использовал вместо этого? Также я использовал только капиталы в именах объектов в моей основной модели данных, иначе я использую строчные буквы. – Slee

+0

В вашем коде в вопросе у вас есть 'ПроизводительID', поэтому мой комментарий к этой части :) Что касается вашей другой копии,' -executeFetchRequest: error: 'возвращает массив. Вам не нужно ничего делать с этим. Вызов '-mutableCopy' просто превращает его в' NSMutableArray', который не делает ничего полезного, когда вы работаете с NSArray, возвращаемым из Core Data. Добавление к этому массиву не будет добавлять объекты к Core Data; удаление объектов из этого массива не удалит их из Core Data. –

0

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

+0

Я попробовал 'fetchLimit == 1' для объектов' core data'. Он просто не работает –

+0

Он отлично работает. – user1447414

Смежные вопросы