2011-07-31 17 views
11

私は整数プロパティ「値」を持つエンティティコストを持つ単純なコアデータストアを持っています。私は、次の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はアレイとセットで動作する特別なものがあり、そのうちの1つは@sumです。あなたはcostsと呼ばれるセットに合計するすべてのオブジェクトを取得し、あなたがオブジェクトごとに合計したい属性がvalueであれば、あなたは、このよう@sum演算子を使用することができた場合:

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

を私はビルドを取得するには、次のコードで失敗:ここにコードを入力してください ':

ので、次も素晴らしい仕事と NSSet *コスト= [ self.managedObjectContext fetchObjectsForEntityName:@ "LogItem" withPredicate:nil]; double summedCosts =費用。総額。 – MrAlek

+1

あなたのリンクのおかげで、これが見つかりました: int summedCosts = [[cost valueForKeyPath:@ "@ sum.value"] intValue]; – MrAlek

+0

ああ、そうですね。投稿を更新します。 – Caleb

0

アップルのマニュアルでは、「@sum演算子は、演算子の右側のキーパスで指定されたプロパティの値の合計を返します。各数値はdoubleに変換され、値の合計が計算され、合計はNSNumberのインスタンスとしてラップされ、返されます。

「intValue」の代わりに「doubleValue」を使用することもできます。また、作業するタイプを取得するために「floatValue」や有効なnsnumber変換を使用することもできます。

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

か::

float sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] floatValue]; 
関連する問題