2010-04-16 18 views
9

Mam podstawową aplikację opartą na danych, która zarządza grupą obiektów. Szukam, aby móc wykonać następujące czynności.Wywoływanie unikalnego zestawu wyników z danymi podstawowymi

Posiadam encję "SomeEntity" z atrybutami: name, type, rank, foo1, foo2.

Teraz SomeEntity ma kilka wierszy, jeśli mówimy ściśle w kategoriach SQL. Próbuję osiągnąć tylko dostępne typy, mimo że każda instancja może mieć zduplikowane typy. Też potrzebuję ich wracam w kolejności według rangi. Więc w SQL, co szukam jest następujący:

SELECT DISTINCT(type) ORDER BY rank ASC

Oto kod mam tak daleko, że łamie:

NSError *error = NULL; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setReturnsDistinctResults:YES]; 
[fetchRequest setPropertiesToFetch:[NSArray arrayWithObjects:@"type", @"rank", nil]]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

// sort by rank 
NSSortDescriptor *rankDescriptor = [[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:rankDescriptor,nil]; 
[fetchRequest setSortDescriptors:sortDescriptors]; 
[sortDescriptors release]; 
[rankDescriptor release]; 

NSArray *fetchResults = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

[fetchRequest release]; 

return fetchResults; 

Teraz, że jest upaść z następujących powodów: Invalid keypath section passed to setPropertiesToFetch:

+0

Zaktualizowany przykład. Wystąpił błąd w usłudze Właściwości, aby pobrać –

+0

. Jeśli określisz właściwości, które chcesz pobrać @ "type" i @ "rank", uzyskasz odrębność w obu usługach. Powinieneś podać tylko @ właściwość typu " –

Odpowiedz

18
NSManagedObjectContext * ctx ; /* some ctx */  
NSFetchRequest * req; /* your request */ 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity" inManagedObjectContext:context]; 
NSDictionary *entityProperties = [entity propertiesByName]; 
[req setEntity:entity]; 
[req setReturnsDistinctResults:YES]; 
[req setPropertiesToFetch:[NSArray arrayWithObject:[entityProperties objectForKey:@"type"]]]; 
[req setSortDescriptors:[NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:@"rank" ascending:YES]]]; 
NSArray * result = [ctx executeFetchRequest:req error:nil]; 
+0

Zmieniono przykład, aby przekazać zamówienie ORDER BY. W rezultacie otrzymasz Tablicę "SomeEntity", z różnymi typami, posortowaną według pozycji –

+0

Little fix. Edytowane Propertiest do pobrania. –

+3

[fetchRequest setResultType: NSDictionaryResultType]; Ustaw, a otrzymasz nie niektóre SomeEntity'ies w wyniku, ale NSDictionary z tylko jedną pobraną właściwość @ "type" w twoim przypadku –

Powiązane problemy