我有以下核心数据结构:
Event <<-->> Team <<-->> Player
(所有关系都是多对多,事件&gt;团队&团队&gt;播放器是有序关系)。
伪代码......
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中的所有玩家拉出来,谓词可行,但是,我想让玩家按照团队和玩家排序(使用有序关系),并分成几个部分(使用团队)作为节标题。)
如果直接从玩家实体中提取,我如何按照有序关系订购玩家,看起来这对NSSortDescriptor来说是不可能的?
我不能拥有“sectionNameKeyPath = linkedTeams.name”,因为linkedTeams是一个多人关系(即使它在这种情况下只返回1个团队)。有没有办法用NSFetchedResultsController这样做,或者我最好只是从我的属性self.event创建自己的数据源?
感谢您的帮助!
答案 0 :(得分:1)
问题是玩家可以在桌面视图中出现两次或更多次(因为玩家可以在多个团队中)。很难使用获取的结果控制器多次获取实体。
相反,你可以获取团队。调整您的datasource
方法以引用团队名称作为部分标题,并使用与玩家的有序关系填充行。现在,如果一个玩家在多个团队中,它将再次显示。
如果您不希望一个玩家加入两个以上的团队,您需要将数据模型更改为
Event <<-->> Team <--->> Player
你的任务应该是微不足道的。
注意:此外,根据我的经验,有序关系的用途有限,而且灵活性在很多情况下都非常麻烦且容易出错。在所有情况下,我都引入了sequence
属性来自行跟踪订单。