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* 对象。为什么不直接将它们命名为GamePlayer

【讨论】:

我知道它不是数据库。这就是我写“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 所说,GAMESPLAYERS 打破了 Core Data 实体的合理命名约定。 GamePlayer 更好。

【讨论】:

【参考方案3】:
[[game valueForKey:@"player"] valueForKey:@"name"]

或者,如果你已经设置了相关的类,

game.player.name

【讨论】:

以上是关于iOS核心数据“加入”两个“表”的主要内容,如果未能解决你的问题,请参考以下文章

核心数据。加入 2 个具有多对多关系的表?

ios、swift、核心数据+多表

相关实体的 iOS 核心数据持久性

solr:如何加入三个核心?

核心数据按两个Descriptor对数据进行排序

IOS:通过一对多关系获取核心数据