Ios 按天获取核心数据总和

Ios 按天获取核心数据总和,ios,objective-c,core-data,Ios,Objective C,Core Data,对于核心数据,我有一个具体但非常常见的任务,但答案是找不到的。 假设我们有收入的CoreData模型。每天它都有未知数量的记录。 任务是显示一段时间内的收入曲线图。 所以,我必须要做的是计算当天的总收入并显示情节 我知道如何计算一段时间的总和: NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"income"]; NSExpression *expression = [NSExpression expre

对于核心数据,我有一个具体但非常常见的任务,但答案是找不到的。 假设我们有收入的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];
NSExpression*keyPathExpression=[NSExpression-expression-forkeypath:@“income”];
NSExpression*expression=[NSExpression expressionForFunction:@“sum:”参数:@[keyPathExpression]];
NSExpressionDescription*expressionDescription=[[NSExpressionDescription alloc]init];
[expressionDescription setName:@“结果”];
[expressionDescription setExpression:expression];
[expressionDescription setExpressionResultType:NSDoubleAttributeType];
NSFetchRequest*fetchRequest=;
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest SetPropertiesTotch:@[expressionDescription]];

NSPredicate*predicate=[NSPredicate predicateWithFormat:@“date>=%@&&date一种行之有效的方法是使用
NSFetchedResultsController
的部分功能。您必须以某种方式保存日期信息才能工作,但Apple提供了一些易于遵循的示例代码

退房

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


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

我认为您正在寻找的是与CoreDat中的SQL“GROUP BY”子句等效的a您可以通过设置fetchRequest的
propertiesToGroupBy
属性来实现这一点。问题是
date
包含(大概)时间,因此每个日期/时间都将单独分组。如果您可以修改数据结构以包含该天的属性(不包括时间),然后您可以使用它来对结果进行分组。@pbasdf我想知道如何将strftime转换为CoreData生成的SQL。例如,首先我们声明了strftime blah的fetchedProperty,然后我们按此字段进行分组。不确定表达式是否会验证它。例如:@Andy我没有考虑过Fetched属性,但我看不出它们如何e是否曾经将strftime引入SQL?@pbasdf-wow实际上可能很有意思。这不是CoreData解决方案。这是一个纯循环。这似乎是一个很好的论据,可以用来转移到Core Data:-)嗯,我更喜欢合适的解决方案,即使你的循环在前100k超过CoreData。误解。我以为你在使用and数组,而你是u唱一个循环,你以为我是在建议一个循环。不。KVC不是一个循环。这是推荐的方法-你可以在核心数据编程指南中检查这个。你不知道!谢谢:-)所以又有了一些魔力!常规数组上的KVC将是一个循环,但无论核心数据返回什么,都会有一些魔力KVC。我对此表示怀疑,我需要看看如果CoreData会为此生成任何SQL。
NSNumber *sum = [[sectionInfo objects] valueForKeyPath:@"@sum.income"];