使用Core Data汇总每日平均值,移动平均值

时间:2016-04-25 22:05:09

标签: ios core-data nsfetchedresultscontroller nsfetchrequest

我有一个具有“amount”属性和“date”属性的实体。我有很多这样的实体,一天多个。我想提供每日平均金额,比如在一个月的时间内。

我理解如何使用聚合函数获得当天平均值的金额。但我不明白如何返回我的数据集中所有日期的每日平均值列表。

似乎必须有比每天创建获取请求更好的方法吗?也许我必须以某种方式利用子查询?

(相关,但不同,我也想计算一个移动平均线,以便我可以返回20天的移动平均数。在这种情况下,平均列表,每个是当天的20天平均值)

2 个答案:

答案 0 :(得分:0)

核心数据不是数据库。你可以在数据库中做一些你需要在Core Data中编写代码的东西(技术上你也需要在数据库中编写代码)。在这种情况下,您需要编写代码。

因此,您可以每天获取并让商店计算平均值,或者您可以检索您感兴趣的所有数据并在内存中执行每日平均值。

每天进行一次提取会减少代码,但会慢一些,因为您需要每天点击一次商店。

在内存中进行一次获取和计算会更快但需要更多代码。

就个人而言,我会从商店中获取所有相关数据,然后迭代谓词并让谓词计算每天的平均值。

答案 1 :(得分:0)

因此,似乎对数据集稍有改动,这确实是可能的。但是,至少对于这个解决方案,您需要负责数据集。

我添加了一个属性" dateDay"这是一个int,表示从锚定日期到" date"我的实体中的属性。 (见Number of days between two NSDates

然后你按" dateDay"分组并使用"平均值:" NSExpression。使用groupBy时,NSExpression聚合对组进行操作。

NSExpression* ex = [NSExpression expressionWithFormat:@"average:(amount)"];
NSExpressionDescription* ed = [[NSExpressionDescription alloc] init];
ed.name = @"result";
ed.expression = ex;
ed.expressionResultType = NSInteger32AttributeType;

NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"];
request.resultType = NSDictionaryResultType;
request.propertiesToFetch = @[@"dateDay", ed];
request.propertiesToGroupBy = @[@"dateDay"];

NSError     * error             = nil;
NSArray     * resultsArray      = [context executeFetchRequest:request error:&error];

尽管propertiesToGroupBy被记录为采用NSExpression,但它似乎无法执行计算,因此传递NSExpression以将NSDate减少为可以分组的组件不起作用。因此需要额外的属性。