如何获取Core Data属性中所有条目的总和?

时间:2015-01-28 20:31:42

标签: objective-c iphone database xcode core-data

我有一个具有实体和多个属性的核心数据数据模型。

其中一个属性是名为

的整数16(NSDecimalNumber)
numberOfSeconds

我想从此属性中找到数据模型中所有条目的总和。

换句话说:我在此属性中有许多用户条目。假设用户创建了3个具有以下细节的条目:

1)numberOfSeconds = 4

2)numberOfSeconds = 2

3)numberOfSeconds = 5

我希望能够获得应该等于 11 的总和。

感谢您的任何帮助!

2 个答案:

答案 0 :(得分:3)

您可以使用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 :(得分:1)

看一下Collection Operators - 它类似于SQL聚合函数。

让我们假设您之前已将实体提取到某个集合entitiesCollection

然后它应该看起来像: NSNumber *result = [entitiesCollection valueForKeyPath:@"@sum.numberOfSeconds"]