Core data groupby和count组合的NSFetchRequest

Core data groupby和count组合的NSFetchRequest,core-data,aggregation,nsfetchrequest,nsexpression,Core Data,Aggregation,Nsfetchrequest,Nsexpression,我是核心数据方面的新手,所以我想编写简单的fetch请求,将结果按某个字段以及该组中另一个字段的计数分组。 例如,我有一个products表,我想按日期和产品计数检索所有分组的产品,sql中的简单查询如下 SELECT DateRegistered,Count(*) FROM Products Group By DateRegistered 您最好的选择是非常灵活的NSFetchedResultsController。您将有一个获取请求,它只获取按日期属性排序的产品实体。请注意,核心数据属性

我是核心数据方面的新手,所以我想编写简单的fetch请求,将结果按某个字段以及该组中另一个字段的计数分组。 例如,我有一个products表,我想按日期和产品计数检索所有分组的产品,sql中的简单查询如下

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

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

您可以使用如下内容创建“获取结果”控制器。查看Apple示例代码(包括Xcode模板),其中这些代码通常是在view controller中惰性创建的:

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 sectionInfo=
[[u fetchedResultsController节]对象索引:i];
int count=[sectionInfo numberOfObjects];

使用“获取结果”控制器,您可以做更多的事情!它将为您管理内存,方便在UI中显示(如表视图或集合视图),并将持久存储的压力降至最低。

因此,如果我有两个产品,第一个是从一天开始注册的,第二个是在一天结束时注册的,我将有两个部分,对吗?是否有任何比较谓词覆盖日期比较?是否有任何技术可以对每个部分执行延迟加载?1)您应该仅为日期创建一个单独的属性。您可以使用获取的属性(动态计算)。请参阅苹果的示例代码“DateSectionTitles”。2) 延迟加载自动包含在获取的结果控制器中;-)!
id <NSFetchedResultsSectionInfo> sectionInfo = 
       [[_fetchedResultsController sections] objectAtIndex:i];
int count = [sectionInfo numberOfObjects];