在 CoreData 中建立关系

Posted

技术标签:

【中文标题】在 CoreData 中建立关系【英文标题】:Make relationship in CoreData 【发布时间】:2014-03-06 12:20:37 【问题描述】:

我有玩家实体和游戏实体。

一个玩家对多个游戏的关系。

所以玩家有位置属性

进攻 防御

当我创建球员并将该球员添加到球队时,我会设置进攻或防守位置。

但是对于不同的比赛,球员可以有进攻位置或防守位置,并且这个位置不能被球队中的球员覆盖。所以如果我用位置进攻创造了10号球员,它就不能被修改,因为球队中的每个球员都有自己的位置。但是对于游戏,我们可以根据需要为玩家设置新的位置。因此,假设对于 id = 10 的游戏,我有 id = 7 的玩家,其位置 = 进攻,但我希望玩家 id = 7 的玩家在 id = 12 的游戏中拥有位置防御。

对于 id 为 10 的游戏,我们有位置进攻玩家

Game
id = 10
player.id = 7
player.position = offense

对于 id 为 12 的游戏,我们为同一个玩家设置了阵地防守

Game
id = 12
player.id = 7
player.position = defense

所以如您所见,我使用不同的游戏,但使用相同的玩家,如果我将新参数设置为 player.position,我将覆盖以前的值,这是不好的,因为它将只存储最新的位置,当我将获取玩家时,我将有最后修改位置的玩家。

我想这是下一个方法:

我有玩家实体,所以要在短号游戏中为每个玩家制作不同的位置,我必须复制这个实体并设置我想要的位置,但是我会复制玩家的问题并不好,因为更好的方法是为每个游戏使用相同的玩家(一个玩家),并使用另一个对象来为具体玩家保存具体游戏的参数。

这有意义吗?或者也许我需要另一种方法来解决这个问题。无论如何,我认为最好的方法是不重复播放器。

【问题讨论】:

您是否考虑过使用实体“玩家属性”或“玩家技能”来保存位置和其他属性以及 player.id 等数据?并让您的实体游戏像这样游戏 id = 10 player.id = 7 playerSkill.position = offence playerSkill.idplayer = 7 playerSkill.speed = 9 ....???? 不确定我是否完全理解设置,但也许你可以在游戏和玩家之间引入第三个实体,也许称之为 PlayerPosition。它将引用游戏和玩家,以及玩家在比赛中的位置。这样一来,球员的原始位置将被单独保留,然后您可以查询他在防守端打球的各个球员。 @SonGoku68 是的,我认为每个玩家都应该拥有一对多的关系。正如您的建议,一名球员将拥有许多技能。我对吗?我会为每场比赛参数化这项技能。对吗? 是的,没错,我会写在一个答案的解决方案中 @mMo 因为我认为拥有额外实体的最佳方式将具有玩家 ID 游戏 ID 和新位置 【参考方案1】:

我对这些情况的解决方案应该是这样的

Game
id = 10
player.id = 7
playerSkill.position = offense
playerSkill.idPlayer = 7 
playerSkill.speed = 9

Player
id
name
nationality
...

PlayerSkill
position
idPlayer
speed
....

因此,您将为每个游戏拥有一个具有他技能的玩家,您可以为同一玩家创建新游戏并创建新技能

【讨论】:

以上是关于在 CoreData 中建立关系的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIPickerView 建立 CoreData 关系

CoreData 瞬态关系示例

无法使用 Swift 在 CoreData 中访问一对多关系

一对多关系CoreData Swift

保存循环删除多对多CoreData关系的一端

如何一次将多个关系保存到 CoreData?