2011-07-31 20 views
11

Tengo un almacén de datos básicos simple con una entidad Costo con un valor de propiedad entero. Quiero resumir todas las cantidades de los costos en mi tienda, que es equivalente a la siguiente instrucción SQL:Cálculo de una suma simple con datos centrales

SELECT sum(value) FROM costs 

¿Cómo hacerlo de la manera más eficiente en Cocoa Touch? ¿Usando Core Data? ¿O simplemente obtener todas las entidades de costos y hacer la suma de forma manual?

Respuesta

11

La mejor manera es usar un fetch for specific values y suministrar un NSExpressionDescription with a sum: function.

Cuando ejecuta la búsqueda, obtiene una matriz de un elemento que contiene un diccionario cuyas claves coinciden con las descripciones de expresiones y cuyos valores son los resultados de las expresiones. En este caso, obtendría una clave sum cuyo valor sería la suma de los atributos dados a la expresión.

+0

¡Gracias! Esta debe ser la mejor manera de hacerlo con bases de datos más grandes. Sin embargo, hay muchas asignaciones de memoria, tal vez no tan eficiente en la búsqueda frecuente en bases de datos más pequeñas. – MrAlek

+4

En realidad, es más eficiente en cuanto a la memoria porque solo asigna unos pocos objetos para el funcionamiento de la recuperación en lugar de docenas o más objetos administrados. Esto mantiene las operaciones en la tienda en lugar de llevar datos a la memoria. Es más como una operación tradicional de base de datos de procedimientos. – TechZen

16

Hay algunos especiales key value coding operators que funcionan en matrices y conjuntos, y uno de ellos es @sum. Si recoge todos los objetos que desea resumir en un conjunto llamado costs, y si el atributo que desea sumar para cada objeto es value, a continuación, puede utilizar el operador @Sum así:

float theSum = [costs valueForKeyPath:@"@sum.value"]; 
+1

consigo una acumulación error con el siguiente código: nsset * Costes = [ self.managedObjectContext fetchObjectsForEntityName: @ "LogItem" withPredicate: nil]; double summedCosts = costs. @ Sum.value; – MrAlek

+1

Lo descubrí gracias a su enlace, esto funcionó: int summedCosts = [[costs valueForKeyPath: @ "@ sum.value"] intValue]; – MrAlek

+0

Ah, claro ... lo siento. Actualizaré la publicación. – Caleb

0

La documentación de Apple dice "El operador @sum devuelve la suma de los valores de la propiedad especificada por la ruta de la clave a la derecha del operador. Cada número se convierte en un doble, se calcula la suma de los valores. y el total se envuelve como una instancia de NSNumber y se devuelve ".

Dicho esto, podría usar "doubleValue" en lugar de "intValue" ... o incluso podría usar "floatValue" o cualquier conversión nsnumber válida para obtener el tipo con el que pretende trabajar.

Por lo tanto, el siguiente también sería un gran trabajo: `introducir el código aquí:

double sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] doubleValue]; 

o:

float sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] floatValue]; 
Cuestiones relacionadas