martes, 17 de enero de 2012

Un "group by" con Core Data

Cuando se trabaja con bases de datos siempre llega un momento en el que hay que hacer algo más complejo que recuperar datos de forma directa y manipularlos. Saber cual es el registro que tiene el valor más alto o más bajo en una propiedad en concreto; identificar los valores diferentes que tienen una propiedad; etc, son situaciones que, aunque no sean cotidianas, vamos a tener que enfrentarnos con ellas.

Si nos basamos en el ejemplo que utilizamos en la entrada anterior, podría ser de utilidad conocer que colores de pelo diferentes o que colores de ojos tenemos en nuestra base de datos. Con SQL esto se suele hacer con la clausulas "distinct" o "group by". La clausula distinct ahora mismo está en desuso y si bien no es 100 % equivalente a la clausula group by si que es cierto que los resultados obtenidos son análogos.

En Cocoa, si tienes una base de datos sqlite puedes hacer perfectamente un group by y gestionar los resultados. Sin embargo, hay una forma más sencilla de hacerlo: con Key-value coding (en adelante KVC) que no solo sirve para los objetos de Core Data si no también para arrays de diccionarios y objetos que estén preparados para KVC. Para ello usaremos los operadores de colección.

Un array con el color de pelo de los individuos de nuestra base de datos se obtendría así:

NSArray *coloresDePelo = [arrayDeIndividuos valueForKeyPath:"@distinctUnionOfArrays.colorPelo"];

El arrayDeIndividuos está formado por objetos de tipo Individuo que es un NSManagedObject y que por lo tanto admite KVC. Si el objeto Individuo fuese un diccionario (NSDictionary o NSMutableDictionary) también funcionaría. El operador que hemos usado es @distinctUnionOfArrays.

Una cosa más para que nos den la Matricula de Honor. Es muy posible que el array esté desordenado, para obtener un array con los colores de pelo ordenados alfabéticamente añadiríamos la siguiente instrucción:

NSArray *coloresDePeloOrdenados = [coloresDePelo sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

La documentación de Apple sobre KVC la puedes encontrar aquí. Ahí podrás ver otros operadores de colección.
Si en vez de leer sobre KVC te apetece escuchar, el episodio 21 de 85 % Cocoa hace una excelente introducción.

No hay comentarios:

Publicar un comentario