2011-07-31 5 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이 있으며 그 중 하나는 @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 valueKey : @ "@ sum.value"] intValue]; – MrAlek

+0

아, 맞아 ... 미안해. 나는 그 소식을 업데이트 할 것이다. – Caleb

0

Apple 설명서에 "@sum 연산자는 연산자 오른쪽의 키 경로로 지정된 속성 값의 합계를 반환합니다. 각 숫자는 double로 변환되고 값의 합계가 계산됩니다. 합계가 NSNumber의 인스턴스로 래핑되고 반환됩니다. "

"intValue"대신 "doubleValue"를 사용할 수도 있습니다. 또는 "floatValue"또는 유효한 nsnumber 변환을 사용하여 작업하려는 유형을 얻을 수도 있습니다.

그래서, 다음도 잘 작동 것이다 : '여기에 코드를 입력

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

또는 :

float sumOfCostValues = [[costs valueForKeyPath:@"@sum.value"] floatValue]; 
관련 문제