iOS核心数据“加入”两个“表”
Posted
技术标签:
【中文标题】iOS核心数据“加入”两个“表”【英文标题】:iOS core data "joining" two "tables" 【发布时间】:2012-12-07 18:59:04 【问题描述】:我必须在核心数据中添加实体:
游戏和玩家
游戏 - 看起来像这样(简化): 木板 用户名
球员 用户身份 名字
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 或类似的..
【问题讨论】:
【参考方案1】:CoreData 不是数据库。
让我再重复一遍。
CoreData 不是数据库。
不要把它想成一个。
CoreData 是一个对象关系图管理和持久化框架。
如果您想访问给定游戏中的玩家,为什么在两个实体中都使用userid
字段?您应该只使用 CoreData 关系。这样一来,您甚至不必考虑它,您只需访问游戏中的关系属性就可以取回您的玩家,反之亦然。
您还应该重命名您的实体。 GAMES 和 PLAYERS 作为表名可能有意义,但您不希望在代码中出现代表一个游戏的 GAMES*
对象。为什么不直接将它们命名为Game
和Player
?
【讨论】:
我知道它不是数据库。这就是我写“joining”和“tables”(引用)的原因。 @Romo:您仍然将其视为数据库。甚至不要那样做。只需在您的两个实体之间建立关系,并通过代码中的属性访问该关系。 是的,我对理论一无所知。我就是不能让它工作?不过还是谢谢.. @Romo:嗯,你试过什么?放弃userid
字段。只需在 .xcdatamodel 编辑器中建立两个实体之间的关系。假设它是一对多关系,Game 将有一个属性,在访问时会返回一个 Player,而 Player 将有一个属性,在访问时会返回 Games 的 NSSet
。
让我另外问一下:在我的 GamesARRAY 中,我如何访问 player.name 值?我可以访问 GAMES 和关系属性(或它的名称?)中的所有值,但不能访问“名称”本身...【参考方案2】:
你在GAMES
上是否真的有一个知道PLAYERS
实体的关系?如果是这样,对于任何 GAMES
对象,您可以遍历该关系 (game.player
) 以获取游戏玩家对象的属性。我们在 Core Data 中不做这样的 JOIN; Core Data 使用关系来抽象出诸如外键和 JOIN 之类的东西(即使这些是在 SQLite 后端的幕后完成的,例如)。
此外,正如 Kevin 所说,GAMES
和 PLAYERS
打破了 Core Data 实体的合理命名约定。 Game
和 Player
更好。
【讨论】:
【参考方案3】:[[game valueForKey:@"player"] valueForKey:@"name"]
或者,如果你已经设置了相关的类,
game.player.name
【讨论】:
以上是关于iOS核心数据“加入”两个“表”的主要内容,如果未能解决你的问题,请参考以下文章