Как я могу получить среднее значение столбца с базовыми данными? - PullRequest
2 голосов
/ 18 октября 2010

Если у меня есть следующий NSManagedObject, как я могу получить среднее значение для number1 и среднее значение для number2?

@interface Log :  NSManagedObject  
{


}


@property (nonatomic, retain) NSNumber * number1;
@property (nonatomic, retain) NSNumber * number2;

Спасибо: D

Ответы [ 2 ]

7 голосов
/ 29 октября 2010
 NSManagedObjectContext *managedObjectContext = [(AppDelegate_Shared*)[UIApplication sharedApplication].delegate managedObjectContext];

 NSFetchRequest *request = [[NSFetchRequest alloc] init];
 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Log" inManagedObjectContext:managedObjectContext];
 [request setEntity:entity];

 // Specify that the request should return dictionaries.
 [request setResultType:NSDictionaryResultType];

 // Create an expression for the key path.
 NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"systolic"];

 // Create an expression to represent the minimum value at the key path 'creationDate'
 NSExpression *avgExpression = [NSExpression expressionForFunction:@"average:" arguments:[NSArray arrayWithObject:keyPathExpression]];

 // Create an expression description using the minExpression and returning a date.
 NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];

 // The name is the key that will be used in the dictionary for the return value.
 [expressionDescription setName:@"averageSystolicPressure"];
 [expressionDescription setExpression:avgExpression];
 [expressionDescription setExpressionResultType:NSInteger32AttributeType];

 // Set the request's properties to fetch just the property represented by the expressions.
 [request setPropertiesToFetch:[NSArray arrayWithObject:expressionDescription]];

 // Execute the fetch.
 NSError *error;
 NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
 if (objects == nil) {
  // Handle the error.
 }
 else {
  if ([objects count] > 0) {
   NSLog(@"object count = %d", [objects count]);

   NSLog(@"Average systolic pressure: %d", [[[objects objectAtIndex:0] valueForKey:@"averageSystolicPressure"] integerValue] );
  }
 }

 [expressionDescription release];
 [request release];
1 голос
/ 08 января 2014

Используйте оператор сбора @avg.

Допустим, вы уже сделали выборку для ваших Log объектов и сохранили полученный NSSet в logs. Тогда вы можете просто сказать:

NSNumber *avg1 = [logs valueForKeyPath:@"@avg.number1"];
NSNumber *avg2 = [logs valueForKeyPath:@"@avg.number2"];

@avg - один из небольшого числа операторов, которые вы можете использовать с коллекциями в ключевых путях. Несколько других @max, @min и @sum.

...