如何获取Core Data列的平均值?

时间:2010-10-18 04:54:33

标签: objective-c core-data ios aggregate

如果我有以下NSManagedObject,我如何获得number1的平均值和number2的平均值?

@interface Log :  NSManagedObject  
{


}


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

谢谢:D

2 个答案:

答案 0 :(得分:7)

 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 :(得分:1)

使用集合运算符@avg

假设您已经对Log个对象进行了提取,并将生成的NSSet存储在logs中。然后你可以简单地说:

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

@avg是少数几个可以在关键路径中与集合一起使用的运算符之一。其他一些是@max@min@sum