Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ios是获得平均值的最有效方法,同时还可以过滤掉一些对象_Ios_Core Data_Aggregate Functions - Fatal编程技术网

ios是获得平均值的最有效方法,同时还可以过滤掉一些对象

ios是获得平均值的最有效方法,同时还可以过滤掉一些对象,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和InvoiceDetail

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。我不认为你可以建立一个表达一对多的关系,虽然我可能是错的。无论如何,谓词将更容易组合,并且不需要子查询。它将非常类似于您在注释中显示的谓词。