NSFetchedResultsController 和 NSPredicate 以及部分名称

Posted

技术标签:

【中文标题】NSFetchedResultsController 和 NSPredicate 以及部分名称【英文标题】:NSFetchedResultsController and NSPredicate and a section name 【发布时间】:2012-05-04 12:44:40 【问题描述】:

我有两个实体的核心数据模型,它们之间存在多对多关系。

例如,

Conference <<---->> Speaker

一个会议可以有多个演讲者,一个演讲者可以参加多个会议。

我尝试使用 NSFetchedResultsController fetchRequest 的主要实体是 Speaker

虽然它确实列出了所有发言人,但我试图将该部分作为“会议”名称并列出该部分中的所有发言人。我想要它,以便作为演讲者的名字“约翰”出现在两个部分中。这意味着他是两次会议的演讲者。

这是我正在使用的 sectionNameKeyPath:@"conferences.Name"

NSFetchedResultsController *aFetchedResultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"conferences.Name"  cacheName:@"fCache"] autorelease];

这有点行不通,当我使用[sectionInfo name] 时,我得到TedEx 作为部分标题。

另一个问题是,如果我一个演讲者出现在一个部分,(会议),它不会出现在另一部分(即使那个部分(会议)有那个演讲者对象)。

这可能是因为,我将 sectionName 作为一组组合会议。 TedEx, SXSW 作为一个单独的部分。

目标应该是如何挑选出 sectionNameKeypath 以仅获取一个会议并列出每个会议中的所有发言人。也许我应该设置某种谓词?

我有点陷入困境,这种方法有问题吗?我读过关于 Predicates 的文章,但如果您是核心数据的新手,这有点难以理解。

【问题讨论】:

【参考方案1】:

这与您考虑的方式略有不同,我不确定是否有更好的方法可以使用 FRC 和 sectionNameKeyPath 来完成它,就像您想要的那样,但也许这会奏效:

    不用获取扬声器,只需执行普通的NSFetchRequest 即可获取 NSArray 称为 conferences。您可以按以下方式排序 会议名称或日期或您需要的任何内容。 然后为您的表格视图将部分的数量设置为[conferences count]。 对于每个部分的行数,获取该部分的会议对象[conferences objectAtIndex:section],并返回该会议的发言人数。 要填充单元格数据,只需通过调用获取扬声器对象:[[conferences objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];

【讨论】:

感谢马克的回答,虽然我是专门询问 NSFetchedResultsController.. 我更喜欢因为任何更改都会在表中反映而无需任何努力,因为我必须处理获取请求中的所有内容.但我确实意识到在 NSFetchResultsController 中没有办法做到这一点

以上是关于NSFetchedResultsController 和 NSPredicate 以及部分名称的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?