使用 NSFetchedResultsController 从核心数据模型中获取谓词到各个部分

Posted

技术标签:

【中文标题】使用 NSFetchedResultsController 从核心数据模型中获取谓词到各个部分【英文标题】:Fetch Predicate from Core Data Model into sections using NSFetchedResultsController 【发布时间】:2012-08-31 17:55:16 【问题描述】:

我一直在解决这个问题Here

并尝试实施我自己的解决方案。不知何故,我没有得到任何部分。只有行。

在这种情况下为 3 行...但没有部分。至少应该有2个部分。 2个月。我知道这一点,因为我检查了模型并且它们就在那里。

我的核心数据模型有一个实体Year,包含许多个月(实体Month)。而Month也有很多天(实体Day

分别代表实体 YearMonthDay 的属性分别是 year_、month_ 和 day_。

我要做的是对所有日子的获取请求在给定的月份在给定的年份在一个这样我就可以让我的部分代表一个月,而行代表天。

谁能帮帮我?

编辑:更新代码

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Day" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];


NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"day_" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];


[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:managedObjectContext
                                      sectionNameKeyPath:@"month.month_"
                                               cacheName:@"Root"];

我的模型是这样的,

非常感谢任何帮助。

谢谢!

努诺

【问题讨论】:

是什么阻止您根据月份名称使用 sectionNameKeyPath,主要排序描述符是月份的订单号 不起作用。 sectionNameKeyPath:@"month.month_" 和 initWithKey:@"month.month_" 它没有给我任何部分,无论如何。只有我已经拥有的 3 行。 【参考方案1】:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat:@"";

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Day" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"Month.month_" ascending:NO];
NSSortDescriptor *sort2 = [[NSSortDescriptor alloc] initWithKey:@"day_" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sort,sort2]];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:"month.month_"
                                               cacheName:@"Root"];

【讨论】:

首先,非常感谢@dorada 的帮助!我打赌你的代码应该可以工作。我实现了它,但它并不好。我不知道为什么我没有得到我的部分。您是否碰巧知道 sectionNameKeyPath:"month.month_" 是否可以引用我模型中的 NSNumber?这是允许的吗?或者month_属性必须是NSString? 我的问题不在这里。我没有实现 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section。这样做之后,我显示了我的部分。我认为您的答案是正确的,因为它实际上是正确的,而且确实很有帮助。谢谢=)【参考方案2】:

一次获取所有内容,并在返回后使用数组字典对其进行排序。因此,您遍历结果并为每个部分创建一个数组,并将其存储在为每个部分索引的字典中。你的字典看起来像

 
 'January", "1,2,6,19,23,nil",
 'February", "2,7,18,19,28,nil",
 'March", "5,6,7,9,29,31,nil",
 etc.

good tutorial with code at icodeblog 提供了执行此操作所需详细信息的示例。

【讨论】:

欣赏这个建议,但我真的很想使用 NSFetchedResultsController。谢谢@Mark

以上是关于使用 NSFetchedResultsController 从核心数据模型中获取谓词到各个部分的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?