2010-08-10 11 views
6

chcę uzyskać pojedynczy obiekt z mojego magazynu danych danych Core, tutaj jest kod używam ale zwraca tablicę obiektów, musi być prostszy i lepszy sposób:odzyskać pojedynczy obiekt z 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] może ograniczyć liczbę zwracanych obiektów, chociaż nadal będziesz otrzymywać NSArray. – magma

Odpowiedz

8

Jeśli orzecznik zawsze pobiera więcej niż jeden wynik:

  • precyzowanie predykat - nie zapomnij można zbudować predykatów z logiką jak i/lub proste równość jest łatwe, ale może nie być wystarczająco selektywny Twój przypadek.

  • wystarczy wybrać efekt chcesz z tablicy, to nic wielkiego - choć jeśli jest to możliwe, powinno być również możliwe, aby zawrzeć predykat ...

  • rozważyć reorganizację modelu danych, dzięki czemu może zawęzić predykat, aby odzyskać tylko jeden przedmiot.

Fetch zawsze zwraca tablicę, to jest jej definicja. Może to być tablica jednego obiektu.

+0

Cóż, to co dostałem działa idealnie :) Dzięki za wyjaśnienie, mój ManufacturerID będzie zawsze wyjątkowy, więc powinienem być cały zestaw. – Slee

6

Będzie on zawsze zwraca tablicę, ale można zrobić to czystsze:

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 zwróci ostatni element w tablicy lub zero jeśli tablica jest pusta. Dzięki temu twój kod będzie trochę czystszy, gdy wiesz, że w tablicy będzie jeden obiekt, lub jeśli nie obchodzi cię, jaki obiekt wyciągniesz z tablicy.

BTW, nazwy własności powinny zaczynać się od małej litery. Jestem zaskoczony, że kompilator cię o tym nie ostrzegł.

+0

, więc zamiast zamiast mutableCopy, gdy chcę wszystkie elementy w tablicy, co powinienem użyć zamiast tego? Również użyłem wielkich liter w nazwach właściwości obiektów w moim podstawowym modelu danych, w przeciwnym razie używam małych liter. – Slee

+0

W twoim kodzie w pytaniu masz 'ManufacturerID' stąd mój komentarz do tej części :) Podobnie jak w przypadku twojej drugiej kopii,' -executeFetchRequest: error: 'zwraca tablicę. Nie musisz robić z tym nic więcej. Wywołanie '-mutableCopy' zmienia ją w' NSMutableArray', która nie robi nic użytecznego, gdy pracujesz z 'NSArray' zwróconym z Core Data. Dodanie do tej tablicy nie spowoduje dodania obiektów do danych podstawowych; usunięcie obiektów z tej tablicy nie spowoduje ich usunięcia z Danych podstawowych. –

0

Wypróbuj fetchRequest.fetchLimit = 1. Nadal masz tablicę, ale z maksymalnie 1 obiektem.

+0

Próbowałem 'fetchLimit == 1' dla obiektów' core data'. To po prostu nie działa –

+0

Działa idealnie. – user1447414

Powiązane problemy