2011-02-28 31 views
5

Tengo una entidad de categoría que tiene muchos gastos. Quiero obtener la suma de todos los gastos para una categoría en un mes determinado:suma de datos básicos en la relación

- (NSNumber *)totalForMonth:(NSDate *)date { ...

NSPredicate *sumPredicate = [NSPredicate predicateWithFormat:@"(ANY %@ <= expenses.created_at) AND (ANY expenses.created_at <= %@)", 
          [date beginningOfMonth], [date endOfMonth]]; 

NSFetchRequest *req = [[[NSFetchRequest alloc] init] autorelease]; 
[req setPredicate:sumPredicate]; 
[req setEntity:entity]; 

NSError *error; 
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:req error:&error]; 

return [fetchedObjects valueForKeyPath:@"[email protected]"]; 

}

El problema con este código es que se produce una excepción porque al parecer esa no es la manera de utilizar @Sum en una relación .

+0

También me gustaría saber la respuesta a esto, porque estoy leyendo la documentación de Apple y nunca parece hacer lo que sugiere que debería. Estoy derivando la duración de una actividad sumando la duración de las subactividades, y me está dando la misma excepción. – horseshoe7

Respuesta

1

Está utilizando @sum con la sintaxis correcta. Lo más probable es que hayas equivocado otra parte de la ruta clave, p. "gastos" en lugar de "gastos". Alternativamente, puede que esté buscando la entidad incorrecta.

Si todo lo que quiere hacer es recuperar esta suma, haga una búsqueda de atributos y establezca su tipo de devolución en el diccionario. (Consulte NSFetchRequest y Core Data Programming Guide Guide) para obtener más información. Eso devuelve una matriz de diccionarios cuya única clave es el nombre del atributo y cuyo único valor es el valor del atributo seleccionado de un objeto administrado. Es más rápido y utiliza menos recursos que buscar objetos completos.

+0

No solo quiere obtener la suma de todos los gastos, sino que también desea obtener la suma del predicado particular que está usando (es decir, las fechas entre un rango dado). Por lo tanto, un getter simple no funcionará para él. – strange

+0

No está aplicando el operador de recopilación al predicado de búsqueda, sino a la matriz de objetos devueltos por la recuperación. Por lo tanto, él tiene los objetos que quiere sumar. Siempre que la ruta de acceso clave sea correcta, 'valueForKeyPath:' no importa de dónde vienen los objetos. – TechZen

1

Puede que necesite crear un getter personalizado para él y acceder desde allí.

es decir

Category.h

@property (nonatomic, readonly) NSNumber* expensesSum;  

Category.m

-(NSNumber*) expensesSum 
{ 
    return [self valueForKeyPath:@"[email protected]"]; 
} 

Además, Actualmente se encuentra volviendo NSNumber * cuando la solicitud devuelve una matriz de objetos hijos Creo.

+0

Agregué esa propiedad y cambié la última línea de mi método a: return [fetchedObjects valueForKeyPath: @ "expensesSum"]; pero ahora entiendo: la categoría de entidad no es un valor clave que cumple con la codificación para la clave "expenses. @ sum.amount". –

+0

¿Encontró la solución para esto? – strange

Cuestiones relacionadas