2010-04-16 2 views
9

J'ai une application de base de données qui gère un tas d'entités. Je cherche à être en mesure de faire ce qui suit.Récupération d'un ensemble de résultats unique avec des données de base

J'ai une entité "SomeEntity" avec les attributs: nom, type, rang, foo1, foo2.

Maintenant, SomeEntity a plusieurs lignes si nous parlons strictement en termes SQL. Ce que j'essaie d'accomplir est de récupérer seulement les types disponibles, même si chaque instance peut avoir des types en double. J'ai également besoin d'eux retournés dans l'ordre selon le rang. Ainsi, dans SQL, ce que je suis à la recherche est la suivante:

SELECT DISTINCT(type) ORDER BY rank ASC

Voici le code que je suis à ce jour qui est la rupture:

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; 

En ce moment, qui se bloque à ce qui suit: Invalid keypath section passed to setPropertiesToFetch:

+0

Exemple mis à jour. Il y avait une erreur sur les propriétés à récupérer –

+0

Et si vous spécifiez des propriétés pour récupérer @ "type" et @ "rank", vous obtiendrez des propriétés distinctes sur les deux propriétés. Vous devez spécifier uniquement la propriété @ "type" –

Répondre

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

Exemple édité à ged ORDER BY. En résultat, vous recevrez Tableau de 'SomeEntity', avec différents types, classés par –

+0

Little fix. Modifié Correct pour aller chercher. –

+3

[fetchRequest setResultType: NSDictionaryResultType]; Définissez-le, et vous ne recevrez pas de résultat SomeEntity, mais NSDictionary avec seulement une propriété récupérée @ "type" dans votre cas. –

Questions connexes