使用 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)
分别代表实体 Year、Month 和 Day 的属性分别是 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