2011-07-31 28 views
11

我有一个简单的核心数据存储,带有一个整数属性“value”的实体Cost。我想总结一下我的商店,这相当于下面的SQL语句的费用全部款项:计算与核心数据的简单求和

SELECT sum(value) FROM costs 

我怎么做,在可可触摸最有效的方法是什么?通过使用核心数据?或者只是获得所有成本实体并手动进行总和?

回答

11

最好的方法是使用fetch for specific values并提供NSExpressionDescription with a sum: function

当您执行读取操作时,您会得到一个包含字典的元素数组,其中的字符串的键匹配表达式描述,其值是表达式的结果。在这种情况下,您将得到sum键,其值将是给定表达式的属性的总和。

+0

谢谢!这必须是使用大型数据库的最佳方式。尽管有很多内存分配,但在经常在较小的数据库上进行读取时可能效率不高。 – MrAlek

+4

它实际上是更高的内存效率,因为您只分配一些对象用于获取操作而不是几十个或更多的托管对象。这将操作保留在商店中,而不是将数据拉入内存。这更像是一个传统的程序数据库操作。 – TechZen

16

在数组和集合上有一些特殊的key value coding operators,其中之一是@sum。如果您获取所有要总结到一个名为costs集中的对象,如果要总结每个对象的属性是value,然后你可以使用@sum操作是这样的:

float theSum = [costs valueForKeyPath:@"@sum.value"]; 
+1

我得到了构建失败,下面的代码: 的NSSet *成本= [ self.managedObjectContext fetchObjectsForEntityName:@“LogItem”withPredicate:nil]; double summedCosts =费用。@ sum.value; – MrAlek

+1

找到它感谢您的链接,这工作: int summedCosts = [[cost valueForKeyPath:@“@ sum.value”] intValue]; – MrAlek

+0

啊,对...很抱歉。我会更新帖子。 – Caleb

0

Apple文档中提到“@sum运算符返回由运算符右侧的键路径指定的属性值的总和,每个数字都转换为double值,计算出值的总和,并且总数被封装为NSNumber的一个实例并返回。“这就是说,你可以使用“doubleValue”而不是“intValue”...或者你甚至可以使用“floatValue”或任何有效的nsnumber转换来获得你打算使用的类型。

因此,下面也将工作的伟大:`输入代码在这里:

double sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] doubleValue]; 

或:

float sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] floatValue];