用于 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()?