Core data NSFetchedResultsController,在NSFetchRequest中具有NSDictionaryResultsType

Core data NSFetchedResultsController,在NSFetchRequest中具有NSDictionaryResultsType,core-data,nspredicate,nsfetchedresultscontroller,nsfetchrequest,Core Data,Nspredicate,Nsfetchedresultscontroller,Nsfetchrequest,我从一个星期以来一直在研究这个问题,还没有找到任何解决方案,所以我想让这个问题更一般化,也许它会帮助用户研究它,并给我一个解决方案 情景: 我有一个费用跟踪iOS应用程序,我有一个名为“DashBoardViewController”的视图控制器(表视图控制器-带FRC),它基本上会对我给定的一周、一个月或一年的费用/收入进行分类,并将其显示为部分标题,例如:(2012年10月1日至10月7日)它根据特定的周、月或年显示支出/收入行和相关内容 我的问题: 我想完成的是: 根据“货币”实体的“类别

我从一个星期以来一直在研究这个问题,还没有找到任何解决方案,所以我想让这个问题更一般化,也许它会帮助用户研究它,并给我一个解决方案

情景:

我有一个费用跟踪iOS应用程序,我有一个名为“DashBoardViewController”的视图控制器(表视图控制器-带FRC),它基本上会对我给定的一周、一个月或一年的费用/收入进行分类,并将其显示为部分标题,例如:(2012年10月1日至10月7日)它根据特定的周、月或年显示支出/收入行和相关内容

我的问题:

我想完成的是:

根据“货币”实体的“类别”属性显示不同的结果,并根据该属性计算“金额”

但是,我的名为“dashboard view controller”的视图控制器中填充了NSFetchedResultsController,其节名key path为“type”,可以是费用也可以是收入。为了得到不同的结果,我将在我的获取请求中使用结果类型作为NSDictionaryResultsType,这将给我唯一的结果,但是FRC失败了,它不适用于此。那么,我将如何获得我的部门名称呢?我已经把代码贴在下面了

编辑-基于MARTIN的建议

-(void)userDidSelectStartDate:(NSDate*)startDate和endDate:(NSDate*)endDate
{
AppDelegate*applicationDelegate=(AppDelegate*)[[UIApplication sharedApplication]委托];
NSManagedObjectContext*上下文=[ApplicationLegate managedObjectContext];
NSFetchRequest*fetchRequest=[[NSFetchRequest alloc]init];
//根据需要编辑实体名称。
NSEntityDescription*entity=[NSEntityDescription entityForName:@“Money”在托管对象上下文:上下文中];
[FetchRequestSetEntity:entity];
//将批次大小设置为合适的数字。
[fetchRequest setFetchBatchSize:20];

NSPredicate*predicateDate=[NSPredicate predicateWithFormat:@”(日期>=%@)和(日期获取的结果控制器不支持更改跟踪(即设置FRC委托)与具有
NSDictionaryResultType
的获取请求相结合

原因记录在
设置includespendingchanges:
函数中:

特殊注意事项

值“是”不支持同时使用 使用结果类型NSDictionaryResultType,包括 聚合结果(如最大值和最小值)。对于字典,数组 从fetch返回的值反映了持久数据库中的当前状态 存储,不考虑任何挂起的更改、插入、, 或上下文中的删除

FRC的更改跟踪意味着获取请求的
includesPendingChanges=YES
,这不适用于
NSDictionaryResultType

一种解决方法是使用FRC而不进行更改跟踪,因此不设置FRC委托。但这意味着要更新表视图,必须

  • 保存托管对象上下文,然后
  • 在FRC上调用
    performFetch
    ,在表视图上调用
    reloadData
另一种解决方法是使用FRC获取所有没有总和聚合的部分和行,并使用结果计算内存中具有聚合的新表行(例如在
controllerDidChangeContent


更新:(来自讨论)另一个重要的问题是,如果您将提取请求与
NSDictionaryResultType
一起使用,那么提取结果控制器的
sectionNameKeyPath
必须包含在提取请求的
属性estofetch
中。

那么,在上述方法中,您认为我应该做些什么才能使节名存在您提到的第二种方法是“使用FRC获取所有节和行”"但是它不会为我的类别提供清晰的行。@Angadmancanda:为什么不尝试第一种方法,这可能更容易实现。我刚刚编辑了我的答案。现在在获取节方面遇到了问题。我只是添加了相应的代码。因为frc委托为零,所以表视图返回的节数现在总是1。你会怎么做我管理它?我还为表视图数据源和委托方法添加了代码。