2011-07-31 22 views
11

Bir tamsayı özelliği "değeri" olan bir varlık Maliyetine sahip basit bir Çekirdek Veri deposum var. Aşağıdaki sql deyimi eşdeğerdir benim deposunda, maliyetlerin tümü miktarlarını özetlemek istiyorum:Temel Veriler ile basit bir toplamın hesaplanması

SELECT sum(value) FROM costs 

Nasıl bu Kakao Touch en etkili yolu yapacağız? Çekirdek Verileri Kullanarak? Ya da sadece tüm maliyet varlıkları toplayın ve toplamayı el ile yapın?

cevap

11

En iyi yol, fetch for specific values kullanmak ve NSExpressionDescription with a sum: function kaynağıdır.

Getiri gerçekleştirdiğinizde, anahtarlarının ifade açıklamalarıyla eşleşen ve değerleri ifadelerin sonuçları olan bir sözlük içeren bir öğe dizisi alırsınız. Bu durumda, değeri, ifadesi verilen özniteliklerin toplamı olacak bir sum anahtarı alırsınız.

+0

Teşekkürler! Bunu daha büyük veritabanlarıyla yapmanın en iyi yolu olmalı. Çok fazla bellek tahsisi var, belki de daha küçük veritabanlarında sık sık alınırken etkili değil. – MrAlek

+4

Aslında daha fazla bellek etkin çünkü onlarca veya daha fazla yönetilen nesne yerine getirme işlemi için yalnızca birkaç nesne ayırıyorsunuz. Bu, verileri belleğe çekmek yerine depoda saklar. Daha ziyade geleneksel bir prosedür veritabanı operasyonu gibi. – TechZen

16

Diziler ve kümeler üzerinde çalışan ve bunlardan biri @sum olan bazı özel key value coding operators vardır. Eğer costs adlı bir dizi içine toplamak istediğiniz tüm nesneleri getirir ve her nesne için özetlemek istiyorum nitelik value ise, o zaman böyle @sum operatörünü kullanabilirsiniz:

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

Ben bir yapı aşağıdaki kodla başarısız olsun: NSSet * maliyetler = [ self.managedObjectContext fetchObjectsForEntityName: @ "LogItem" withPredicate: nil]; çift summedCosts = maliyetler @ sum.value; – MrAlek

+1

Link'iniz sayesinde bu işe yaradı: int summedCosts = [[costForKeyPath: @ "@ sum.value"] intValue]; – MrAlek

+0

Ah, doğru ... bunun için üzgünüm. Gönderiyi güncelleyeceğim. – Caleb

0

Apple belgelerine göre "The @sum operatörü, operatörün sağındaki anahtar yolunun belirttiği özellik değerlerinin toplamını döndürür. Her sayı bir çifte dönüştürülür, değerlerin toplamı hesaplanır, ve toplam bir NSNumber örneğine sarılır ve geri döndürülür. "

Yani, "intValue" yerine "doubleValue" kullanabilirdiniz ... veya "floatValue" yi veya geçerli bir nsnumber dönüşümü ile birlikte çalışmak istediğiniz türü elde edebilirsiniz.

Yani, şu da büyük iş olacaktır: `kodu buraya girin:

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

ya:

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