2010-04-16 10 views
9

Tengo una aplicación basada en datos básicos que administra un grupo de entidades. Estoy buscando poder hacer lo siguiente.Recuperación de un único conjunto de resultados con Core Data

Tengo una entidad "SomeEntity" con los atributos: nombre, tipo, rango, foo1, foo2.

Ahora, SomeEntity tiene varias filas si hablamos estrictamente en términos de SQL. Lo que intento lograr es recuperar solo los tipos disponibles, aunque cada instancia puede tener tipos duplicados. También los necesito devueltos en orden según el rango. Así que en SQL, lo que estoy buscando es la siguiente:

SELECT DISTINCT(type) ORDER BY rank ASC

Aquí está el código que tengo hasta ahora que está rompiendo:

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; 

Ahora que está chocando con lo siguiente: Invalid keypath section passed to setPropertiesToFetch:

+0

Ejemplo actualizado. Hubo un error en Propiedades para obtener –

+0

Y si especifica propiedades para obtener @ "tipo" y @ "rango", obtendrá distintas propiedades. Debe especificar solo la propiedad @ "tipo" –

Respuesta

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

Ejemplo editado para ged ORDER BY. En el resultado, recibirá la matriz de 'SomeEntity', con diferentes tipos, ordenados por rango –

+0

Little fix. Edited Propertiest para recuperar. –

+3

[fetchRequest setResultType: NSDictionaryResultType]; Configúrelo y no recibirá ningún resultado de SomeEntity'ies, pero NSDictionary con solo una propiedad recuperada @ "tipo" en su caso –