2011-07-31 65 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];