分组核心数据对象

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

GROUP BY with SUM() using 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?我在这里***.com/questions/42522546/… 也有同样的问题,但仍然一无所知。谢谢!【参考方案2】:

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

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

【讨论】:

谢谢。我正在获取第一个日期并迭代到当前日期。

以上是关于分组核心数据对象的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:按核心数据属性分组和求和

核心数据 - 分组

实体中的属性分组(核心数据)

核心数据:分组和计数结果返回空列表

在运行循环的旋转中使用核心数据撤消组

按名称分组的核心数据获取属性