0

NSExpressions를 사용하여 코어 데이터에서 집계 정보를 가져 오는 방법을 배우려고 시도했습니다. 가져 오기가 올바르게 작동하지만 처리를 위해 결과 데이터를 구문 분석하는 데 문제가 있습니다. 나는 뭔가를 놓쳐 버릴 것임에 틀림 없지만 나는 그것이 무엇인지 알 수 없다. 일부 엔티티에 대한 속성의 합계를 가져 오는 중이며이 부분이 올바르게 있습니다. 그렇다면 결과에 대해 수학을하고 싶지만 원하는 결과를 얻지 못하고 있습니다.NSDecimalNumber가 NSDecimalNumbers가 NSExpression 코어 데이터 가져 오기에서 NSDictionary에 저장 될 때의 산술 문제

여기 여기에 지금은 더 로켓 과학자는 아니지만, $ 100 + $ 300- $ (25) = $ (375) 내 콘솔 로그

2013-08-23 23:56:35.775 NSExpressionCoreDataTestApp[5162:907] { 
    currentBalance = 100; 
    postedCredits = 300; 
    postedDebits = 25; 
} 

내 샘플 코드

[_mainContext save:nil]; 
NSMutableDictionary *accountBalances = [[NSMutableDictionary alloc] init]; 
NSFetchRequest* request = [[NSFetchRequest alloc] init]; 
request.entity = [NSEntityDescription entityForName:@"AccountTransaction" 
          inManagedObjectContext:_mainContext]; 

// build an expression to calculate the sum 
NSExpressionDescription* totalOfTransactionsDescription = [[NSExpressionDescription alloc] init]; 

NSExpression *keyExpression = [NSExpression expressionForKeyPath:@"amount"]; 
NSExpression *theExpression = [NSExpression expressionForFunction:@"sum:" 
                 arguments:@[keyExpression]]; 

[totalOfTransactionsDescription setName:@"totalOfTransactions"]; 
[totalOfTransactionsDescription setExpression:theExpression]; 
[totalOfTransactionsDescription setExpressionResultType:NSFloatAttributeType]; 

// we want the results in a dictionary 
request.resultType = NSDictionaryResultType; 
request.propertiesToFetch = @[totalOfTransactionsDescription]; 
NSArray* results; 
NSDictionary* fetchResultsDictionary; 
NSDecimalNumber *total; 

// credits 
request.predicate = [NSPredicate predicateWithFormat:@"isCredit == %@",[NSNumber numberWithBool:YES]]; 
results = [_mainContext executeFetchRequest:request error:nil]; 
fetchResultsDictionary = [results objectAtIndex:0]; 
total = [fetchResultsDictionary objectForKey:@"totalOfTransactions"]; 
[accountBalances setObject:total forKey:@"postedCredits"]; 

// debits 
request.predicate = [NSPredicate predicateWithFormat:@"isCredit == %@",[NSNumber numberWithBool:NO]]; 
results = [_mainContext executeFetchRequest:request error:nil]; 
fetchResultsDictionary = [results objectAtIndex:0]; 
total = [fetchResultsDictionary objectForKey:@"totalOfTransactions"]; 
[accountBalances setObject:total forKey:@"postedDebits"]; 


// build an account balance 
NSDecimalNumber *startingBalance = [NSDecimalNumber decimalNumberWithString:@"100.00"]; 
NSDecimalNumber *currentBalance = startingBalance; 

// add deposits 
currentBalance = [currentBalance decimalNumberByAdding:[accountBalances objectForKey:@"postedCredits"]]; 

// subtract debits 
currentBalance = [currentBalance decimalNumberBySubtracting:[accountBalances objectForKey:@"postedDebits"]]; 

[accountBalances setObject:currentBalance forKey:@"currentBalance"]; 

NSLog(@"%@", accountBalances); 

입니다. currentBalance는 항상 $ 100입니다. 또한 내 샘플 데이터를 기반으로 postedCredits & postedDebits는 맞지만 아무 것도 추가되거나 시작 초기 잔액에서 빼는 것 같습니다. 결과를 어딘가에 입력해야 할 필요가있을 것이라고 확신하지만 추가 또는 뺄셈이 일어나기 전에 반입 결과가 사전 &에 추가되기 전에 시도했습니다. 심지어 그들을 시도하기 전에 사전에서 그들을 당긴 후 [NSDecimalNumber NSDecimalNumberWithString :] 시도했다.

누군가가 올바른 방향으로 나를 가리킬 수 있다면, 나는 그것을 매우 감사 할 것입니다. 미리 감사드립니다 !!

+0

문제를 재현 할 수 없습니다. 나는 그것을 테스트했다. (명시 적 숫자, 예를 들어'[accountBalances setObject : [NSDecimalNumber decimalNumberWithString : @ "300.00"] forKey : @ "postedCredits"];'최종 결과는'currentBalance = 375'이다. 코드를 단계적으로 수행하고 중간 결과를 확인하십시오. –

+1

의견에 감사드립니다. 오늘 아침에 알아 냈습니다. – vichudson1

답변

0

오늘 아침에 신선한 눈으로 바라 보았을 때 나는 그 답이 나를 쳐다 보았다는 것을 깨달았다.

[totalOfTransactionsDescription setExpressionResultType:NSFloatAttributeType]; 

는 바로 그것을 지워
[totalOfTransactionsDescription setExpressionResultType:NSDecimalAttributeType]; 

를하고 있어야합니다. :-)