2016-04-25 94 views
0

我有一个具有“金额”属性和“日期”属性的实体。我有许多这些实体,一天中有多个。我想提供每日平均的金额,例如在一个月的时间内。使用核心数据汇总每日平均数,移动平均数

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

看起来好像有一个比每天创建提取请求更好的方法?也许我必须以某种方式利用子查询?

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

回答

0

核心数据不是数据库。您可以在数据库中执行某些操作,您需要在Core Data中编写代码(技术上,您还需要在数据库中编写代码)。这是您需要编写代码的情况。

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

每天做一次抓取的代码会少一些,但是会比较慢,因为每天需要打一次商店。

在内存中执行一次提取和计算会更快,但会占用更多代码。

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

+0

嗨马库斯。谢谢你的评论。看起来你在核心数据方面有很多经验,所以如果你看到我发布的答案和评论,如果你看到问题,我会很感激。 – user903309

+0

它工作吗?如果是这样,那么你不需要我的确认:)因为你可以调整数据模型和输入数据,所以你比原来隐含的问题具有更大的灵活性,并且你找到了一个更清晰的解决方案。做得好 :) –

0

因此,它似乎与数据集稍有变化,这确实是可能的。但是,至少对于这个解决方案来说,你需要负责你的数据集。

我添加了一个属性“dateDay”,它是一个int,表示从我的实体中的锚定日期到“date”属性的天数。 (请参阅Number of days between two NSDates

然后,您按“dateDay”进行分组并使用“average:”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成能在不工作进行分组的组件。因此需要额外的属性。