ios是获得平均值的最有效方法,同时还可以过滤掉一些对象
我试图获取子实体中属性的平均值,同时也试图只包含一组选定的记录 我的核心数据模型中有两个实体:Invoice和InvoiceDetailios是获得平均值的最有效方法,同时还可以过滤掉一些对象,ios,core-data,aggregate-functions,Ios,Core Data,Aggregate Functions,我试图获取子实体中属性的平均值,同时也试图只包含一组选定的记录 我的核心数据模型中有两个实体:Invoice和InvoiceDetail Invoice:<br> invoiceNum - attribute<br> invoiceDate - attribute<br> invoiceDetails - one-to-many relationship to InvoiceDetail InvoiceDetail:<br> it
Invoice:<br>
invoiceNum - attribute<br>
invoiceDate - attribute<br>
invoiceDetails - one-to-many relationship to InvoiceDetail
InvoiceDetail:<br>
itemAmount - attribute<br>
itemType - attribute<br>
invoice - one-to-one relationship to Invoice<br>
但是,我尝试只获取itemType=1的对象的平均值。我可以循环查看invoiceDetail项并手动执行此操作,但我知道这将导致性能问题。我不确定做这件事的最佳方式是什么
感谢您的帮助。您可以通过包含表达式的获取请求来完成此操作,如下所示:
- (NSDictionary *)myFetchResults
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"InvoiceDetail" inManagedObjectContext:myContext];
request.predicate = [NSPredicate predicateWithFormat:@"itemType = %@", [NSNumber numberWithInt:1]];
request.resultType = NSDictionaryResultType;
NSExpressionDescription *aveExDescr = [[NSExpressionDescription alloc] init];
[aveExDescr setName:@"myAverage"];
[aveExDescr setExpression:[NSExpression expressionForFunction:@"average:"
arguments:[NSArray arrayWithObject:
[NSExpression expressionForKeyPath:@"itemAmount"]]]];
[aveExDescr setExpressionResultType:NSFloatAttributeType];
request.propertiesToFetch = [NSArray arrayWithObject:aveExDescr];
NSError *err = nil;
NSArray *results = [self.moContext executeFetchRequest:request error:&err];
[request release];
[err release];
return results;
}
NSArray *results = [self myFetchResults];
NSDictionary *resultsDictionary = [results lastObject];
NSNumber *average = [resultsDictionary objectForKey:@"myAverage"];
提取将返回一个字典,您可以按如下方式访问该字典:
- (NSDictionary *)myFetchResults
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"InvoiceDetail" inManagedObjectContext:myContext];
request.predicate = [NSPredicate predicateWithFormat:@"itemType = %@", [NSNumber numberWithInt:1]];
request.resultType = NSDictionaryResultType;
NSExpressionDescription *aveExDescr = [[NSExpressionDescription alloc] init];
[aveExDescr setName:@"myAverage"];
[aveExDescr setExpression:[NSExpression expressionForFunction:@"average:"
arguments:[NSArray arrayWithObject:
[NSExpression expressionForKeyPath:@"itemAmount"]]]];
[aveExDescr setExpressionResultType:NSFloatAttributeType];
request.propertiesToFetch = [NSArray arrayWithObject:aveExDescr];
NSError *err = nil;
NSArray *results = [self.moContext executeFetchRequest:request error:&err];
[request release];
[err release];
return results;
}
NSArray *results = [self myFetchResults];
NSDictionary *resultsDictionary = [results lastObject];
NSNumber *average = [resultsDictionary objectForKey:@"myAverage"];
请注意,此代码尚未经过测试。如果您使用的是NSDecimalNumbers,您也可以使用
NSDecimalAttributeType
而不是float类型。非常感谢,这非常有用!我刚刚被要求提供另一个过滤器,我正在努力将其包括在内。发票实体包含另一个名为invoiceStatus的属性,该属性具有整数值。例如,如果我还想筛选invoiceStatus为1的发票对象,NSPredicate能否与多个实体一起工作?我试图将FetchRequest实体更改为“Invoice”,并使用一个谓词:@“invoiceStatus==%@和invoiceDetails.itemType==%@”,但这不起作用。是的,您可以使用多个实体,也可以使用复合谓词。谓词不起作用,因为对多对多关系的操作不正确。Invoice有许多InvoiceDetails,谓词应该询问是否至少有一个具有请求值的itemType。您可以通过子查询来实现这一点。这些问题(&)提供了一些如何设置子查询的示例。请注意,如果您仍然获得itemAmount的平均值,则可能必须将fetch请求实体更改回InvoiceDetails。我不认为你可以建立一个表达一对多的关系,虽然我可能是错的。无论如何,谓词将更容易组合,并且不需要子查询。它将非常类似于您在注释中显示的谓词。