如何获取核心数据属性中所有条目的总和?

Posted

技术标签:

【中文标题】如何获取核心数据属性中所有条目的总和?【英文标题】:How to get Total Sum of all entries in a Core Data attribute? 【发布时间】:2015-01-28 20:31:42 【问题描述】:

我有一个包含一个实体和几个属性的核心数据数据模型。

其中一个属性是一个整数 16 (NSDecimalNumber),称为

numberOfSeconds

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

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

1) numberOfSeconds = 4

2) numberOfSeconds = 2

3) numberOfSeconds = 5

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

感谢任何帮助!

【问题讨论】:

【参考方案1】:

您可以使用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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于如何获取核心数据属性中所有条目的总和?的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据iOS中获取每个实体的最后一个条目

两个日期之间实体属性的核心数据总和

所有实例属性的核心数据总和

如何在核心数据中使用 NSPredicate 从属性之一获取值

根据 Swift Core Data 中的关系获取与特定实体相关的所有条目

如何根据来自多个 Core Data 属性的计算值进行排序