用于 groupby 和 count 组合的 NSFetchRequest

Posted

技术标签:

【中文标题】用于 groupby 和 count 组合的 NSFetchRequest【英文标题】:NSFetchRequest for groupby and count combination 【发布时间】:2013-06-04 12:22:16 【问题描述】:

我是 Core Data 的新手,所以我想编写简单的 fetch 请求来按某个字段对结果进行分组,并计算该组中另一个字段的计数。 所以例如我有产品表我想按日期和产品数量检索所有分组产品,sql中的简单查询就像

SELECT DateRegistered,Count(*) FROM Products  Group By DateRegistered

【问题讨论】:

【参考方案1】:

您最好的选择是非常灵活的NSFetchedResultsController。您将有一个获取请求,该请求仅获取按日期属性排序的 Product 实体。请注意,核心数据属性应以小写字母开头。

您将使用以下内容创建获取的结果控制器。查看 Apple 示例代码(包括 Xcode 模板),这些代码通常在视图控制器中延迟创建:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
request.sortDescriptors = @[ [NSSortDescriptor 
             sortDescriptorWithKey:@"dateRegistered"
             ascending:YES] ];


_fetchedResultsController  = [NSFetchedResultsController
   initWithFetchRequest:request
   managedObjectContext:self.managedObjectContext
   sectionNameKeyPath:@"dateRegistered"
   cacheName:"Root"];

只有当每天的日期确实相同时,这才有效。您可能希望使用一个字符串,因为 NSDate 类型将精确到分秒,并且您将在每个“组”中计数一个。

使用获取的结果控制器,您可以轻松访问所需的所有数字。例如。 “组”数i 的计数(正确的术语是“部分”):

id <NSFetchedResultsSectionInfo> sectionInfo = 
       [[_fetchedResultsController sections] objectAtIndex:i];
int count = [sectionInfo numberOfObjects];

您可以使用 fetched results 控制器做更多事情!它将为您管理内存,促进在您的 UI 中显示(例如表视图或集合视图)并最大限度地减少持久存储的压力。

【讨论】:

所以如果我有两个产品,第一个从一天开始注册,第二个在一天结束时注册,我会有两个部分,对吗?是否有任何比较谓词可以覆盖日期比较? 还有什么技术可以对每个部分进行延迟加载吗? 1) 您应该只为日期创建一个单独的属性。您可以使用获取的属性(即时计算)。请参阅 Apple 的示例代码“DateSectionTitles”here。 2)延迟加载自动包含在获取的结果控制器中;-))!

以上是关于用于 groupby 和 count 组合的 NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章

具有两个分类变量的数据帧上的 Groupby 和 count() [重复]

如何在熊猫中执行选择性 groupby().count()?

直接从Mysql查询数据生成报告(使用groupby、count)

itertools.groupby 的反面?

Linq:GroupBy、Sum 和 Count

在 'groupby()' 和 'value_counts() 函数之后选择每个组的第一行