Iphone 如何设置核心数据中一对多关系的排序?

Iphone 如何设置核心数据中一对多关系的排序?,iphone,core-data,Iphone,Core Data,假设我有一个包含许多玩家对象的游戏对象(棒球游戏)。每场比赛的阵容都有特定的顺序 对于如何存储此场景的订单,是否有任何建议 如果只是一个游戏,我可以简单地在每个玩家对象中存储一个索引。但是,每个游戏的顺序都会发生变化。因此,如果玩家对象被删除,我希望确保游戏对象也得到更新(保持引用完整性) 就我目前的工作而言,我将始终拥有2到4名球员 我尝试为游戏对象中的每个玩家创建一个单独的关系,例如“玩家向导”、“玩家两个”等。但是,当我尝试在玩家对象中创建反向关系时,我只能将“游戏”关系设置为其中一个玩家

假设我有一个包含许多玩家对象的游戏对象(棒球游戏)。每场比赛的阵容都有特定的顺序

对于如何存储此场景的订单,是否有任何建议

如果只是一个游戏,我可以简单地在每个玩家对象中存储一个索引。但是,每个游戏的顺序都会发生变化。因此,如果玩家对象被删除,我希望确保游戏对象也得到更新(保持引用完整性)

就我目前的工作而言,我将始终拥有2到4名球员

我尝试为游戏对象中的每个玩家创建一个单独的关系,例如“玩家向导”、“玩家两个”等。但是,当我尝试在玩家对象中创建反向关系时,我只能将“游戏”关系设置为其中一个玩家(“玩家向导”、“玩家两个”等)

接下来,我可能会尝试在玩家对象中创建四个反向关系,专门指向游戏对象中的关系,但我认为这不正确,而且会非常混乱

另一个选择是,我可以潜在地将每个玩家对象的完整URL作为字符串存储在游戏对象中。然而,我需要管理删除等等


感谢您的推荐。

我过去也遇到过类似的问题。我个人做这件事的方式就是把它们编入索引。添加一些属性,例如
索引
。然后,每当进行更改时,调用一些本地方法来重新标记索引。这里有一个粗略的例子,可以给出基本的逻辑

- (void)retagPlayers {
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Players" inManagedObjectContext:self.managedObjectContext];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"game like %@", currentGame];
    NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"index" ascending:YES];
    [request setEntity:entity];
    [request setSortDescriptors:[NSArray arrayWithObject:sorter]];
    [request setPredicate:predicate];

    NSError *error = nil;
    NSArray *players = [self.managedObjectContext executeFetchRequest:request error:&error];

    int index = 0;
    for (Player *player in players) {
        player.index = index;
        index++;
    }
}

这假设了一些事情,所以我应该指定其中一些。在其中,它假设您有一个名为players的players实体。并且每个都与一个
游戏
有关系,在本例中是一个字符串。这些东西在您的代码中可能不同,并且可以相应地进行更改。无论哪种方式,逻辑都是一样的。它基本上是在上下文中搜索特定游戏的玩家实例(使用谓词),然后按索引对它们进行排序。然后它枚举返回的数组,并将新索引设置为更改后的索引。我希望这能有所帮助

如果我正确理解您的问题,您需要的是“游戏”和“玩家”之间的多对多关系,而不是多对多关系。此外,由于您需要每个关系的排序功能,您必须创建一个全新的实体来管理:

  • “游戏”与“玩家”之间的多对多关系
  • 每个“玩家”关于一个“游戏”的排序(和相反)
  • 我推荐一个名为“GamesPlayers”的实体,它有两对多的关系,一对“游戏”,一对“玩家”实体。最后,您需要添加一个排序属性——我不会称之为“索引”,因为这是苹果在Cocoa框架中经常使用的一个非常常见的名称


    要管理随着关系更改而更新的排序属性,您应该为“GamesPlayers”创建NSManagedObject子类,覆盖
    addGamesObject:
    removeGamesObject:
    以及
    AddPlayerObject:
    RemovePlayerObject:
    实体。

    谢谢。我确实在我的帖子中提到了使用索引。但是,每个玩家的顺序与每个游戏相关,必须以某种方式存储。您的示例只是设置一个从零开始的索引值,而不考虑索引应该是什么。我想我可以只存储对象URL。经过一些思考后,我想也许可以将全局索引应用于所有播放器对象0..n。然后,每个游戏对象可以存储四个索引,从而保持玩家的顺序。例如,playerOne=8,playerTwo=1,playerTree=2,playerFour=5。可以使用查找方法检索对应于相应索引的播放器。目前这可能很难做到,因为我需要执行数据迁移。在我的示例中,我简单地给出了一种更新值的方法,使它们在初始设置之前保持有序。这将由您来初始化。我也想举个例子,但我不想强加太多,因为我不知道你的应用程序在这方面是如何设置的。只要你能为你的玩家设定一些初始顺序,以上的逻辑应该能帮助你在添加/删除玩家时保持这个顺序谢谢Florian。我想我可以做点像这样的事。然而,经过深思熟虑,我认为最好是为每个玩家添加一个迭代的“索引”属性,从零开始。然后,我可以将此索引值用于playerOne、playerTwo等。这将需要我管理玩家的添加/删除。我今天早上才想到这个解决办法。