2013-08-24 3 views
0

У меня есть объект под названием Rounds, в котором есть основные данные о раундах гольфа. Я пытаюсь рассчитать количество раундов, а также средний балл. Однако каждый раз, когда я пытаюсь вычислить эти значения, он возвращает 0 (ноль). Ошибок нет, и никаких сбоев нет.NSExpression всегда возвращает ноль

У меня есть следующие функции в Rounds.m:

+(NSNumber *)aggregateOperation:(NSString *)function onAttribute:(NSString *)attributeName withPredicate:(NSPredicate *)predicate inManagedObjectContext:(NSManagedObjectContext *)context 
{ 
    NSExpression *ex = [NSExpression expressionForFunction:function 
           arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:attributeName]]]; 

    NSExpressionDescription *ed = [[NSExpressionDescription alloc] init]; 
    [ed setName:@"result"]; 
    [ed setExpression:ex]; 
    [ed setExpressionResultType:NSInteger64AttributeType]; 

    NSArray *properties = [NSArray arrayWithObject:ed]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setPropertiesToFetch:properties]; 
    [request setResultType:NSDictionaryResultType]; 

    if (predicate != nil) 
     [request setPredicate:predicate]; 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Rounds" 
           inManagedObjectContext:context]; 
    [request setEntity:entity]; 

    NSArray *results = [context executeFetchRequest:request error:nil]; 
    NSDictionary *resultsDictionary = [results objectAtIndex:0]; 
    NSNumber *resultValue = [resultsDictionary objectForKey:@"result"]; 
    return resultValue; 
} 

Я затем вызвать этот метод из моей точки зрения контроллера, чтобы установить значение меток для количества раундов и забил средним:

-(NSNumber*) scoringAverageCalc 
{ 
    NSNumber *scoreAverage = [Rounds aggregateOperation:@"average:" onAttribute:@"roundScore" withPredicate:nil inManagedObjectContext:_managedObjectContext]; 
    return scoreAverage; 
} 

-(NSNumber*)countOfRounds 
{ 
    NSNumber *roundCount = [Rounds aggregateOperation:@"count:" onAttribute:@"roundDate" withPredicate:nil inManagedObjectContext:_managedObjectContext]; 
    return roundCount; 
} 

Может кто-нибудь, пожалуйста, скажите мне, почему я не получаю правильное значение?

ответ

2

Я думаю, NSExpression является излишним для простых сумм. Я бы сделал это следующим образом: выберите ваши раунды как обычные управляемые объекты (NSManagedObjectResultType), а затем используйте KVC, который должен иметь только необходимые агрегаторы.

NSNumber *sum = [rounds valueForKeyPath:@"@sum.score"]; 
NSNumber *avg = [rounds valueForKeyPath:@"@avg.score"]; 

Простой, не так ли? Проверьте это here.

+0

Отличный совет, было намного лучше просто держать его простым. Спасибо за помощь. – tnb121

0

Ваш код работает для меня. Вы уверены, что в ваших сущностях или именах атрибутов нет орфографических ошибок?

Смежные вопросы