iOS核心数据“加入”两个“表”

时间:2012-12-07 18:59:04

标签: ios core-data

我必须在核心数据中使用实体:

游戏和玩家

GAMES - 看起来像这样(简化): 板 用户ID

PLAYERS 用户身份 名称

球员是独一无二的

我需要选择GAMES并将PLAYERS.name列添加到此结果中。

我已经设置了所有核心数据和关系,可以从“表格”中进行选择,并将其放在数组和Tableview中。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"GAMES" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
GamesARRAY =[context executeFetchRequest:fetchRequest error:&error];

依旧......

但我如何选择,或从玩家表中访问数据?我知道所有的基础知识和理论,但我真的需要代码示例。不仅仅是答案:使用NSSet或类似..

3 个答案:

答案 0 :(得分:3)

CoreData不是数据库。

让我再说一遍。

CoreData不是数据库。

不要把它想象成一个。

CoreData是一个对象关系图管理和持久性框架。

如果您想要访问特定游戏中的玩家,为什么在两个实体中都使用userid字段?您应该只使用CoreData关系。这样你甚至不必考虑它,你只需访问你游戏中的关系属性就可以恢复你的玩家,反之亦然。

您还应该重命名您的实体。游戏和玩家可能会像表名一样有意义,但你不希望代码中有一个代表一个游戏的GAMES*对象。为什么不将它们命名为GamePlayer

答案 1 :(得分:0)

你真的与知道GAMES实体的PLAYERS有关系吗?如果是这样,对于任何GAMES对象,您可以遍历该关系(game.player)以获取游戏玩家对象的属性。我们不在核心数据中这样做JOIN; Core Data使用关系抽象出外键和JOIN之类的东西(例如,这些都是在SQLite后端的幕后完成的。)

另外,正如Kevin所说,GAMESPLAYERS打破了核心数据实体的合理命名约定。 GamePlayer要好得多。

答案 2 :(得分:0)

[[game valueForKey:@"player"] valueForKey:@"name"]

或者,如果您已设置相关课程,

game.player.name