2011-07-27 11 views
9

Para simplificar: Hay 3 columnas en una tabla llamada tarjetas.NSPredicar algo equivalente al GRUPO de SQL POR

plazo ID packTitle

id es una columna - enteros de 0 ..... 100

packTitle - cadena que describe los paquetes, digamos que hay 3 tipos de PACK1 paquete, PACK2, PACK3

término - diferentes nombres sin clasificar de 101 elementos.

por sentencia SQL

select packTitle from cards group by packTitle; 

puedo obtener la lista de 3 artículos.

¿Podría sugerir NSPredicate equivalente de declaración SQL GROUP BY. Necesito obtener una matriz para poblar en UITableView.

Respuesta

15

CoreData es un marco de gestión de gráficos de objeto, no un almacén de datos de SQL. Por lo tanto, debe, lo más rápido posible, salirse de la mentalidad de SQL. NSPredicate está concebido como un predicado no sorprendente para los objetos calificadores en el gráfico de objetos. Por lo tanto, puede buscar todos los objetos que coinciden con una consulta, pero eso no es lo mismo que agrupar esos resultados. Si desea realizar operaciones agregadas, use la codificación Key-Value collection operators. Bajo el capó, Core Data puede convertir estos a SQL sensible, pero eso es exclusivamente un detalle de implementación.

En este caso, se puede obtener el conjunto de valores únicos packTitle con

[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"]; 

que le dará el conjunto distinto de valores packTitle en la colección myCards. Si desea esto para todas las tarjetas en los almacenes Core Data, deberá ejecutar una consulta para todos los cards, luego aplique esta operación de recopilación.

La alternativa es crear una entidad PackInformation, o alguna que contenga una propiedad title. A continuación, puede tener solo 3 de estas entidades en el almacén de datos, haciendo referencia a ellas desde las entidades de paquete apropiadas. Es trivial buscar los tres (o lo que sea que sea el número final) y obtener sus títulos.

Como han dicho otros, si lo que intenta hacer es fundamentalmente informar desde un conjunto de datos relacionales, es mejor que vaya directamente con SQLite. Todo depende de la cantidad de otros beneficios que obtenga de Core Data.

+0

Muchas gracias por estos detalles y gracias adicionales por haber prestado atención a mi pregunta. Parece que necesito aprender a codificar los valores clave para entender tu respuesta. También es interesante cómo eliminar todas las tarjetas con packTile llamado PACK1. Espero encontrar una respuesta moviéndose en esta dirección. – Michael

+0

NSPredicar por sí mismo no tiene nada que ver con los datos centrales. Se puede usar con matrices y otras bases de datos como Realm. Es por eso que esta es una pregunta válida y está perfectamente bien para comparar con SQL – brainray

2

Suponiendo que está usando CoreData ... según el Apple Documentation

No se puede necesariamente se traduce consultas SQL “arbitrarias” en predicados o ir a buscar solicitudes. No hay manera, por ejemplo, para convertir una instrucción SQL como

SELECT t1.name, 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 

en una solicitud de búsqueda. Debe buscar los objetos de interés, luego realizar un cálculo directamente utilizando los resultados o utilizar un operador de matriz .

Si necesita hacer consultas complejas como esta, puede que sea mejor utilizar SQLite.

+0

Gracias por su respuesta. Entonces tengo que trabajar con los resultados. – Michael

+0

De nada. –