【问题标题】:How to group fetched result from Core Data, iOS dev如何对从 Core Data、iOS 开发人员获取的结果进行分组
【发布时间】:2013-05-04 18:14:33
【问题描述】:

我有一个名为“Expense”的实体的核心数据,如下所示: 实体:“费用” 属性:“日期”、“类别”、“金额”…………

我的问题是,是否可以按年或按月获取多少费用? 我知道获取是基于时间段还是类别,我可以使用 NSPredicate 过滤获取的结果。但是我心中的“日期”属性应该是按年和月分开的,所以我可以像在 SQL 查询中那样对它们进行分组。是否可以直接在 fetch 中执行此操作?否则,唯一的方法是将整个数据提取到 NSArray 并通过 NSPredicate 进行一些过滤。

我已经搜索了几天,但没有找到直接的答案。现在我实际上有点相信没有直接的解决方案。但是我仍然想看看是否有人可以为我提供一些更好的解决方案,因为每个开发人员都必须解决这个问题。

任何建议将不胜感激,谢谢你们:)

=============================添加================== ===== 此外,据我所知,关于索引列表的技术,我希望将基于“年月”的获取结果在 UITableView 中列出。我可能会根据每个索引的“年月”为每个数组提供费用。有没有更好的方法来做到这一点?

我基于数据结构的想法是建立一些to-many关系,从Entity(year) to-many Entity(year,month,year-month) to-many Entity(year-月、日期、金额……)。当我为索引 UITableView 获取每个数组时,也许这会给我带来一些便利。

【问题讨论】:

    标签: ios core-data nsfetchrequest


    【解决方案1】:

    您可以在 Expense 类中实现 @readonly 属性“年”和“月”,然后在谓词中使用它们。您不必单独存储这些值,只需使用 NSDateComponents 在 getter 中计算它们即可。

    【讨论】:

    • 如果那样,我可以简单地使用: NSPredicate *filter = [NSPredicate predicateWithFormat:@"getMonth=%d AND getYear=%d",month,year] ??如果是这样,那就太棒了!但是 Entity 中的 getter 方法不会被视为直接获取到 moContext 的属性。但是同样,我可以将整个数据提取到一个数组中,然后通过 Entity 的 getter 再次过滤......我认为这可能会降低性能。尽管将 mre 属性设置为 Entity 也会导致这种情况。我是对的:)
    • @JimZ 没错 - 如果您添加只读派生属性,您可以在谓词中使用它们。效果很好。在类类别中实现它们,这样当您出于某种原因重新生成托管对象类时它们不会被覆盖。这当然前提是您没有特别的性能考虑。
    • @Monolo 那太好了,我回家后马上做一个演示。谢谢!!
    • @JimZ 如果您在这些派生属性上有任何侦听器(例如,我怀疑 fetch 控制器会添加自己),那么请记住实现 keyPathsForValuesAffecting<your property>(请参阅 docs)当您看到此内容时工作就像魔术一样:-)
    【解决方案2】:

    再添加三个属性来将日期组件存储在您的实体中 (将日期组件分隔为日、月和年,然后存储这三个条目),并且还有一个 date 属性来存储完整的日期。 当您想按年或年月获取数据时,只需使用谓词即可。

    NSPredicate *filter = [NSPredicate predicateWithFormat:@"month=%d AND year=%d",month,year];
    [request setPredicate:filter];
     NSArray *results = [self.moContext executeFetchRequest:request error:nil];
     if(results.count > 0) {
                           //do your manipulations.
                }
    

    【讨论】:

    • 很好的答案,我之前确实想过,但我只是认为这违反了数据库表设计规则。但现在我其实觉得核心数据虽然也提供了关系,但也不太像真正的数据库,而且更方便。谢谢你 Madhusudhan!
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2019-02-05
    • 2017-10-28
    • 2020-09-29
    • 2012-10-27
    • 1970-01-01
    相关资源
    最近更新 更多