使用NSFetchedResultsController返回具有有序关系的对象
我有以下核心数据结构:
Event <<-->> Team <<-->> Player
(所有关系都是多对多的,Event> Team&Team> Player是有序的关系)。
伪代码...
self.event = an instance of Event that has been populated earlier on in the process.
linkedTeams = the relationship between Team & Player.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:self.doc.managedObjectContext];
[fetchRequest setEntity:thisEntry];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"ANY %@ IN linkedTeams", self.events.teams];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.doc.managedObjectContext sectionNameKeyPath:nil cacheName:nil];
这将拉出self.event.teams中的所有玩家,罚款,谓词起作用,但是,我希望玩家根据团队和玩家(通过使用有序关系)进行排序,并分成若干部分(使用Team作为部分头)。
如果从玩家实体直接拉取玩家,我如何按照有序关系来排列玩家,看起来这对于NSSortDescriptor来说是不可能的?
我不能拥有“sectionNameKeyPath = linkedTeams.name”,因为linkedTeams是一对多的关系(尽管在这种情况下它只会返回1个团队)。 有没有办法做到这一点与NSFetchedResultsController或我最好只是创建自己的数据源形式我的财产self.event?
谢谢你的帮助!
问题在于玩家可能在你的表格视图中出现两次或更多次(因为玩家可能在多个团队中)。 使用提取的结果控制器不止一次地获取实体是很困难的。
相反,你可以取得球队。 调整您的datasource
方法,以引用团队名称作为部分标题,并将与订购关系的行填充到播放器中。 现在,如果一个球员不止一个球队,它将会再次显示。
如果您不希望一个玩家参加两个以上的团队,则需要将您的数据模型更改为
Event <<-->> Team <--->> Player
你的任务应该是微不足道的。
注意:另外,根据我的经验,有序关系结果是使用有限,灵活性在许多情况下非常麻烦并且容易出错。 在所有情况下,我都引入了sequence
属性来跟踪订单。
上一篇: Using NSFetchedResultsController to return objects with ordered relationships
下一篇: NSFetchedResultsController with sections sorted by TWO criteria