如果我有以下NSManagedObject,我如何获得number1
的平均值和number2
的平均值?
@interface Log : NSManagedObject
{
}
@property (nonatomic, retain) NSNumber * number1;
@property (nonatomic, retain) NSNumber * number2;
谢谢:D
答案 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
。