使用NSFetchedResultsController返回具有有序关系的对象

时间:2013-04-17 12:04:29

标签: ios core-data nspredicate nsfetchedresultscontroller nssortdescriptor

我有以下核心数据结构:

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创建自己的数据源?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题是玩家可以在桌面视图中出现两次或更多次(因为玩家可以在多个团队中)。很难使用获取的结果控制器多次获取实体。

相反,你可以获取团队。调整您的datasource方法以引用团队名称作为部分标题,并使用与玩家的有序关系填充行。现在,如果一个玩家在多个团队中,它将再次显示。

如果您不希望一个玩家加入两个以上的团队,您需要将数据模型更改为

Event <<-->> Team <--->> Player 

你的任务应该是微不足道的。

注意:此外,根据我的经验,有序关系的用途有限,而且灵活性在很多情况下都非常麻烦且容易出错。在所有情况下,我都引入了sequence属性来自行跟踪订单。