核心数据组按月和总和

时间:2017-03-01 03:18:18

标签: ios objective-c core-data group-by

基于GROUP BY个月的SUM核心数据是否有办法------------------------ date | amount ------------------------ 30-08-2017 | 124000000 28-10-2017 | 124000000 16-10-2017 | 124000000 14-12-2017 | 124000000 20-12-2017 | 124000000 ------------------------ ? 我有这样的数据

NSDate *now = [NSDate date];
NSDate *oneYearAgo = [now addYears:-1];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTable" inManagedObjectContext:moc];
[request setEntity:entity];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(myDate >= %@) AND (myDate <= %@) AND isActive == %@", oneYearAgo, now, @YES];
[request setPredicate:predicate];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"myDate" ascending:YES];
[request setSortDescriptors:@[sort]];

NSExpressionDescription* ex = [[NSExpressionDescription alloc] init];
[ex setName:@"totalCost"];
[ex setExpression:[NSExpression expressionWithFormat:@"@sum.amount"]];
[ex setExpressionResultType:NSDecimalAttributeType];

[request setPropertiesToFetch:[NSArray arrayWithObjects:@"myDate", ex, nil]];
[request setPropertiesToGroupBy:[NSArray arrayWithObject:@"myDate"]];
[request setResultType:NSDictionaryResultType ];

NSArray *result = [moc executeFetchRequest:request error:nil];

我只需要显示最近一年,所以我创建了这样的获取请求

Aug 2017 | 124000000
Oct 2017 | 248000000
Dec 2017 | 248000000

这是我所需要的最接近的解决方案,但该分组仍然基于日期而是月份,而且它的数量并不总和。

所以我想得到像这样的结果

<html>
 <head>
   <style>
         body {
         background-image:url(image.png);
         }
       </style>
     </head>
 <body>
  <form>
  </form>
 </body>
</html>

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以将NSFetchResultsContoller与自定义部分路径一起使用,以根据月份对数据进行分组。然后,您可以汇总该部分中的所有项目以获得所需的结果。以下代码段可用于创建获取结果控制器

NSFetchedResultsController *dateAmountFetchResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:managedObjectContext
                                    sectionNameKeyPath:@"monthIndex" cacheName:@"MyEntity"];

在DateAmount实体上创建一个新的瞬态属性,名为&#34; monthIndex&#34;。然后在DateAmount类 - (NSString *)monthIndex上创建一个方法,以返回正确的月号字符串。 @&#34; monthIndex&#34;应该按照上面的代码片段用作获取结果控制器的节名称键路径。 在获取请求的排序描述符中,使用带有键@&#34; monthIndex&#34;的排序描述符。用于排序项目,因为它是NSFetchedResultsController的要求。