如何在Core Data中设置一对多关系的排序?

时间:2011-07-11 23:56:50

标签: iphone core-data

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

是否有关于如何存储此方案的订购的建议?

如果它只是一个游戏,我只需在每个Player对象中存储一个索引。但是,每个游戏的顺序都会发生变化。因此,如果Player对象被删除,我想确保Game对象也得到更新(保持参照完整性)。

对于我正在做的事情,我总是会有2到4名玩家。

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

接下来我可以尝试在Player对象中创建四个反向关系,专门指向Game对象中的关系,但我认为它不正确并且会非常混乱。

另一个选择是我可以将每个玩家对象的完整URL存储为Game对象中的字符串。但是,我需要管理删除等等。

感谢任何建议。

2 个答案:

答案 0 :(得分:1)

过去我遇到过类似的问题。我个人采用的方式是将它们编入索引。添加一些属性,例如index。然后,每当进行更改时,请调用一些重定位索引的本地方法。这是一个粗略的例子,应该给出基本的逻辑

- (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的玩家实体。并且每个都与game有关系,在这种情况下是一个字符串。这些东西可能在您的代码中有所不同,因此可以相应更改。两种逻辑都是一样的。它基本上在您的上下文中搜索特定游戏的Player实例(使用谓词),然后按索引对它们进行排序。然后它通过返回的数组进行枚举,并将新索引设置为更改后应该是什么。我希望有帮助

答案 1 :(得分:1)

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

  1. “游戏”和“玩家”之间的多对多关系
  2. 关于一个“游戏”(和反向)的每个“玩家”的排序
  3. 我推荐一个叫做“GamesPlayers”的实体,它有两对多关系,一个是“游戏”,另一个是“玩家”实体。最后你需要添加一个排序属性 - 我不称之为“索引”,因为这是Apple在Cocoa Framework中经常使用的一个非常常见的名称

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

相关问题