2011-12-30 9 views

Odpowiedz

9

Istnieją dwa sposoby rozwiązania tego problemu:
- najpierw uzyskać dane do NSSet lub NSArray i użyć operatora @sum:

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

drugi stosując specyficzne sprowadzić for specific value z dodatkiem NSExpressionDescription z sumą. W ten sposób jest trudniejszy, ale lepiej dla większych DB

+0

Ruszt, podoba mi się pierwszy sposób. A co, jeśli Pióra mają jeszcze jedną właściwość "Kolor" i chcę policzyć sumę czerwonych piór? – Jim

+0

Po prostu buduj tablicę tylko za pomocą czerwonych pisaków za pomocą NSPredicate i podsumuj tę tablicę. –

+0

Thanks a lot ... – Jim

0

Jestem zakładając równowartość SQL chcesz to:

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

Spójrz na tego post dla kodu, którego szukasz.

+0

To nie jest Obj kod C) iPhone jest Obj C – Jim

10

Tak, można uzyskać z tych danych podstawowych, zamiast pobierania i oceny wyników. Możesz wykonywać funkcje takie jak sumowanie danych rdzenia za pomocą NSExpression.

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

Listę funkcji, które można używać go tutaj

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

Następnie należy utworzyć obiekt NSExpressionDescription gdzie można ustawić wyrażenia tho sumOfCountExpression która właśnie została utworzona.

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

Następnie skonstruuj swoje żądania tak, jak zwykle, a następnie ustaw właściwość, aby pobrać do tego wyrażenia.

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

Patrz: Core Data Programming Guide

+2

Warto zauważyć, że trzeba ustawić resultType na NSFetchRequest być NSDictionaryResultType i że wartość zwracana będzie w zwróconym słowniku pod klucz „sumOfCount” lub cokolwiek ustawić w ustawNazwe powyżej. –

+0

@ScottAllen: Dzięki! To było upaść i mnie jazdy Bonkers, i ta odpowiedź jest drugim opis jak to zrobić, widziałem, że pomija ten mały ważny szczegół! –

Powiązane problemy