2011-12-30 8 views

Respuesta

9

Hay dos maneras de resolver este problema:
primera - obtener sus datos a NSSet o NSArray y utilizar el operador @Sum:

//assume that `pens` are NSArray of Pen 
NSNumber *countSum=[pens valueForKeyPath:"@sum.count"]; 

segundo se ha podido recuperar mediante medios específicos con for specific value añadido NSExpressionDescription con una suma. De esta manera es más difícil pero mejor para db's más grandes

+0

Grate, me gusta primera forma. ¿Y qué pasa si las plumas tienen una propiedad más 'Color' y quiero contar la suma de plumas rojas? – Jim

+0

Simplemente construya una matriz solo con bolígrafos rojos usando NSPredicate, y resuma esta matriz. –

+0

Muchas gracias ... – Jim

0

Asumo el equivalente SQL que desea es:

select sum(p.count) 
from pens p 
where makerName = '{whatever maker you are querying for}' 

Tome un vistazo a este post para el código que está buscando.

+0

eso no es Obj código C) iPhone es Obj C – Jim

10

Sí, puede obtenerlos de los datos centrales, en lugar de obtener y evaluar los resultados. Puede realizar funciones como sum en los datos centrales mediante el uso de NSExpression.

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"Count"]; 
NSExpression *sumOfCountExpression = [NSExpression expressionForFunction:@"sum:" 
               arguments:[NSArray arrayWithObject:keyPathExpression]]; 

Para obtener una lista de las funciones que se pueden utilizar ir aquí

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSExpression_Class/Reference/NSExpression.html.

Luego necesita crear un objeto NSExpressionDescription donde establece la expresión tho la sumOfCountExpression que acaba de crear.

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 
[expressionDescription setName:@"sumOfCount"]; 
[expressionDescription setExpression:sumOfCountExpression]; 
[expressionDescription setExpressionResultType:NSDoubleAttributeType]; 

Luego construya sus solicitudes como lo haría normalmente y luego configure la propiedad para recuperar esa expresión.

[request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]]; 

Consulte: Core Data Programming Guide

+2

Vale la pena señalar que debe establecer el ResultType en NSFetchRequest para que sea NSDictionaryResultType, y que el valor devuelto se encuentre en el diccionario devuelto con la clave 'sumOfCount' o lo que establezca en setName encima. –

+0

@ScottAllen: ¡Gracias! Eso fue estrepitoso y me volvió loco, ¡y esta es la segunda descripción de cómo hacer esto que he visto que omite este pequeño detalle importante! –

Cuestiones relacionadas