【问题标题】:Grouping Core Data Objects分组核心数据对象
【发布时间】:2011-02-25 13:38:54
【问题描述】:

我有一个核心数据实体,它的 created_at 属性是 NSDate,金额属性是 NSInteger。

我想提出一个返回按月分组的金额总和的请求。比如:

[['February 2010', 450], ['January 2010', 300]]

如果我必须首先获取特定日期范围的所有结果,然后计算总和,或者是否有其他方法,我不确定如何处理。

附:我在 iphone 4.2 sdk 上这样做。

【问题讨论】:

标签: iphone objective-c cocoa core-data


【解决方案1】:

即使认为答案已经被接受,让我添加这个更复杂、更快速的方法以确保完整性。

假设您的数据模型中没有对月份进行建模,您将需要获取每个月的对象,然后对金额求和。根据需要重复几个月。

因此,第一步是为 fetch 创建一个变量谓词。像这样的:

NSPredicate *exPred=[NSPredicate predicateWithFormat:@"%@

NSPredicate *exPred=[NSPredicate predicateWithFormat:@"(%@<=created_at) AND (created_at<=%@)", monthStartDate,monthEndDate];

...然后执行 fetch 并求和返回:

NSNumber *theSum=[@sum.[context executeFetchRequest:theFetch error:&error].amount];

...或更少的牛仔:

NSArray *fetchedObjects=[context executeFetchRequest:theFetch error:&error];
    // if no error
    NSNumber *theSum=[fetchedObjects valueForKeyPath:@"@sum.amount"];

每个月都把它放在一个循环中。

谓词和集合操作比循环快得多。尽可能使用它们而不是循环。

【讨论】:

  • 我确定您知道您的代码完全不正确并且无法编译。此外,您的 NSPredicate 不会解析并会引发异常。
  • 谢谢你,我要试试你的方法。
  • 我最终使用了你的方法来计算总和,同时仍然按照接受的答案中的建议手动计算第一个和最后一个日期。
  • 嗨,你从哪里得到monthStartDatemonthEndDate?我在这里stackoverflow.com/questions/42522546/… 也有同样的问题,但仍然一无所知。谢谢!
【解决方案2】:

我会将您感兴趣的对象范围提取到一个数组中,然后枚举该数组并随时添加所有数量。

我不确定这是否也可以通过创建一个复杂的请求来解决,但我的直觉告诉我无论如何设置都会很棘手(如果可能的话)......

【讨论】:

  • 谢谢。我正在获取第一个日期并迭代到当前日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多