2015-01-28 5 views
0

У меня есть модель данных данных ядра с сущностью и несколькими атрибутами.Как получить общую сумму всех записей в атрибуте Core Data?

Одним из таких атрибутов является Integer 16 (NSDecimalNumber) называется

numberOfSeconds 

Я хочу, чтобы найти сумму всех записей есть в моей модели данных из этого атрибута.

Другими словами: у меня будет много записей пользователей в этом атрибуте. Допустим, пользователь создает 3 записи с этими особенностями:

1) numberOfSeconds = 4

2) numberOfSeconds = 2

3) numberOfSeconds = 5

I» м, надеясь удержать общую сумму, которая должна быть равна .

Цените любую помощь в этом!

ответ

2

Вы можете использовать NSExpressionDescription получить сумму непосредственно с помощью выборки запроса (не извлекая сами управляемые объекты, которые могут быть неэффективны, если у вас есть многие из них).

Не забудьте установить NSDictionaryResultType для запроса на выборку (я получил EXC_BAD_ACCESS, если я этого не сделал).

NSExpression *keyExpression = [NSExpression expressionForKeyPath:@"numberOfSeconds"]; 
NSExpression *sumExpression = [NSExpression expressionForFunction:@"sum:" arguments:@[keyExpression]]; 

NSExpressionDescription *sumDescription = [[NSExpressionDescription alloc] init]; 
sumDescription.name = @"sumOfSeconds"; 
sumDescription.expression = sumExpression; 
[sumDescription setExpressionResultType:NSDecimalAttributeType]; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"]; 
request.resultType = NSDictionaryResultType; 
[request setPropertiesToFetch:@[sumDescription]]; 

NSError *error = nil; 
NSManagedObjectContext *context = ... //get the context somehow 
NSArray* fetchResult = [context executeFetchRequest:request error:&error]; 
NSNumber *sum = fetchResult.firstObject[sumDescription.name]; //this is your sum 

Ссылка: Apple Core Data guide

1

Взгляните на Collection Operators - это нечто похожее на функции агрегации SQL.

Предположим, что вы ранее вынашивали объекты в какой-то коллекции entitiesCollection.

Затем он должен выглядеть следующим образом: NSNumber *result = [entitiesCollection valueForKeyPath:@"@sum.numberOfSeconds"]

Смежные вопросы