2011-02-01 48 views
6

Sé que puedo usar @distinctUnionOfObjects para encontrar algo como lo siguiente en SQL:GROUP BY equivalente para los datos básicos

SELECT a_value 
FROM my_table 
GROUP BY a_value; 

Lo que estoy buscando es todos los datos devuelven en una matriz , no solo la matriz de valores que coincide con el grupo por expresión. En esencia, estoy buscando el equivalente de la siguiente consulta SQL para datos básicos:

SELECT * 
FROM my_table 
GROUP BY a_value; 
+0

Por favor, háganos saber si una respuesta que ayudó a salir. –

Respuesta

15

Es análogo

SELECT 'Status', COUNT(*) FROM 'Records' GROUP BY 'Status':

NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:@"Record"]; 
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Record" 
              inManagedObjectContext:myManagedObjectContext]; 
NSAttributeDescription* statusDesc = [entity.attributesByName objectForKey:@"status"]; 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath: @"url"]; // Does not really matter 
NSExpression *countExpression = [NSExpression expressionForFunction: @"count:" 
                  arguments: [NSArray arrayWithObject:keyPathExpression]]; 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName: @"count"]; 
[expressionDescription setExpression: countExpression]; 
[expressionDescription setExpressionResultType: NSInteger32AttributeType]; 
[fetch setPropertiesToFetch:[NSArray arrayWithObjects:statusDesc, expressionDescription, nil]]; 
[fetch setPropertiesToGroupBy:[NSArray arrayWithObject:statusDesc]]; 
[fetch setResultType:NSDictionaryResultType]; 
NSError* error = nil; 
NSArray *results = [myManagedObjectContext executeFetchRequest:fetch 
                 error:&error]; 

Found here

+0

@ "Bimawa" ¿Por qué ha usado el atributo "url" aquí? – Developer

+0

@Developer // Realmente no importa // Creo que es una rudeza. – Bimawa

+0

En el fragmento de arriba, 'url' es un campo en la tabla' Registros'. No hay forma de especificar 'COUNT (*)' con el asterisco, pero esto es equivalente a 'COUNT (x)', donde 'x' es cualquier columna de la tabla. Eso es lo que se especifica en esa línea. – Demitri

-1

Puede utilizar Predicate Programming.

EDITAR: Lo sentimos, no se pueden usar predicados para Group By, al menos, no es sencillo. Acabo de leer sobre las referencias.

Limitaciones: No es necesario traducir las consultas SQL "arbitrarias" en predicados o solicitudes de búsqueda. No hay manera, por ejemplo, para convertir una instrucción SQL como

t1.name SELECT, V1, V2

FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2 

    FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1 
+0

¿Puede ser más específico? Sé que existen predicados, pero no sé cómo resolverían mi problema. ¿Cómo proporcionarían algo así como un grupo por o distinto() en sql? – smtlaissezfaire

+0

Sí, noté esa declaración también.Desafortunadamente, no está del todo claro cuáles son esas limitaciones. La consulta que figura en la documentación es mucho más compleja (se trata de unir): hago una lectura de tabla directa. – smtlaissezfaire

3

Usted podría tratar de usar un objeto NSFetchedResultsController para proporcionar agrupación a través de la sectionNameKeyPath constructo en el inicializador. Tenga en cuenta que las FRC se utilizan principalmente para combinar con una vista de tabla, pero no es realmente necesario. De esta forma, podría agrupar sus resultados por su sectionNameKeyKey que también podría ser un atributo transitorio en su modelo.

Como comentario, no recomendaría pensar en Core Data en términos de una base de datos, que no lo es. Core Data está diseñado para facilitarle la persistencia y administrar las relaciones entre objetos. El hecho de que en el iOS se ejecute sobre SQLite no lo convierte en un reemplazo de la base de datos.

Referencia: NSFRC Reference

0

encuentro este método (más o menos similar a la respuesta aceptada) para ser un poco más limpio y más fácil comprender. Este es el SQL equivalente a:

SELECT COUNT(*), a_value FROM my_table GROUP BY a_value;

NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:[MyTable className]]; 

// create expression for grouped column 
NSExpressionDescription *aValueDescription = [[NSExpressionDescription alloc] init]; 
aValueDescription.name = @"aValue"; // name of key in result dictionary 
aValueDescription.expression = [NSExpression expressionWithFormat:@"aValue"]; 
aValueDescription.expressionResultType = NSObjectIDAttributeType; 

// create expression for count 
NSExpressionDescription *countDescription = [[NSExpressionDescription alloc] init]; 
countDescription.name = @"count"; // name of dictionary key in result dictionary 
countDescription.expression = [NSExpression expressionWithFormat:@"[email protected]"]; 
countDescription.expressionResultType = NSInteger32AttributeType; 

// fill out fetch request 
fetchRequest.propertiesToGroupBy = @[@"aValue"]; 
fetchRequest.propertiesToFetch = @[aValueDescription, countDescription]; 
//fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"count" ascending:NO]]; // not sure why this crashes 
fetchRequest.resultType = NSDictionaryResultType; // required for "group by" requests 

NSError *error = nil; 
NSArray *results = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 

El regresaron results es una matriz de NSDictionary. Tenga en cuenta que las propiedades de la descripción name pueden ser lo que usted desee, solo son los nombres de las claves en los diccionarios devueltos. Se puede agregar un predicado a la solicitud de búsqueda para filtrar las filas de la tabla; este código devuelve todas las filas.

puntos de bonificación a cualquier persona que me puede decir cómo hacer el trabajo descriptor de tipo ...