【问题标题】:Core Data fetch sum by days核心数据按天获取总和
【发布时间】:2015-02-13 08:11:36
【问题描述】:

我对 Core Data 有特定但相当常见的任务,但找不到答案。 假设我们有 CoreData 收入模型。每天它都充满了未知数量的记录。 任务是显示一段时间内的收入图。 所以,我必须做的是计算一天的总收入并显示情节。

我知道如何总结一段时间:

NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"income"];
NSExpression *expression = [NSExpression expressionForFunction:@"sum:" arguments:@[keyPathExpression]];

NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init];
[expressionDescription setName:@"result"];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSDoubleAttributeType];

NSFetchRequest *fetchRequest = <#create fetch request#>;
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:@[expressionDescription]];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"date >= %@ && date <= %@", startDate, endDate,];
[fetchRequest setPredicate:predicate];

如果我将 NSCompoundPredicate 设为所有字段的总和,响应包含一个总和。

如何在每个时间段执行它并获得一次响应?

谢谢

【问题讨论】:

  • 我认为您正在寻找的是相当于 SQL 'GROUP BY' 子句。在 CoreData 中,您可以通过设置 fetchRequest 的 propertiesToGroupBy 属性来做到这一点。问题是date 包括(大概)时间,因此每个日期/时间将单独分组。如果您可以修改数据结构以包含当天的属性(不包括时间),那么您可以使用它来对结果进行分组。
  • @pbasdf 我想知道如何将 strftime 压缩到 CoreData 生成的 SQL 中。就像首先我们声明 fetchedProperty 是 strftime blah 然后我们按此字段分组。不确定表达式是否会验证这一点。示例:aprogrammersday.blogspot.com/2014/02/…
  • @Andy 我没有想到 Fetched Properties,但我看不出它们如何用于将 strftime 放入 SQL 中?
  • @pbasdf wow 实际上可能会很有趣。

标签: ios objective-c core-data


【解决方案1】:

一种行之有效的方法是使用NSFetchedResultsController 的部分功能。您必须以某种方式保留日期信息才能使其正常工作,但 Apple 提供了一些易于遵循的示例代码。

查看Date Section Titles

然后您将使用 section info 协议的 objects 方法来处理您想要的对象。使用 KVC,计算总和非常容易(而且优雅)(无需涉及表达式语法)。

NSNumber *sum = [[sectionInfo objects] valueForKeyPath:@"@sum.income"];

如果您担心效率 - 不要担心。这将在具有接近 100.000 条记录的主线程上正常工作。获取的结果控制器将确保在后台同时考虑内存和 CPU 限制。

【讨论】:

  • 这不是 CoreData 解决方案。这是一个纯循环。
  • 似乎是迁移到 Core Data 的一个很好的论据。 :-)
  • 好吧,即使您的循环在前 100k 中胜过 CoreData,我也更喜欢合适的解决方案。
  • 误会。我以为您正在使用和数组,而您正在使用循环,您以为我在提议循环。不,KVC 不是循环。这是推荐的方法 - 你可以在核心数据编程指南中查看。
  • 不知道!谢谢 :-) 所以又有一些魔法了!常规数组上的 KVC 将是一个循环,但事实证明 CoreData 返回的任何内容都有一些神奇的 KVC。我对此持怀疑态度,我需要看看 CoreData 是否会为此生成任何 SQL。
猜你喜欢
  • 1970-01-01
  • 2017-07-20
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-29
相关资源
最近更新 更多