CoreData:大量实体或将数组存储为可转换



我正在制作一个游戏,每个生物都可以有3次攻击,每次攻击都可以同时产生许多效果。我正在使用CoreData来保存所有数据。

我的问题的一个基本例子可以从三个实体中看到:

  1. Creature:包含与Attack实体的多对多关系
  2. Attack:包含与Effect实体的多对多关系
  3. Effect:包含效果细节(伤害、迷惑、中毒等)

因此,首先,我需要为每个唯一的Creature实体提供三个唯一的Attack实体。然后,我需要将Effect实体添加到每个攻击中。我的问题是,每个效果可能有不同的值,但它与所有其他生物的效果基本相同:它仍然是"伤害",但每个生物的伤害值不同。

我只想到了两种方法:

  1. 为每个Attack和每个Creature创建一个唯一的Effect,这样我就可以在实体中存储效果值。这样做的缺点是数据可能会变大:3x3x400=3600个Effect实体,每个实体只存在一个关系。

  2. 为每种类型(损坏、混淆等)创建一个Effect,并在Attack实体中使用可转换数据类型,我在其中存储一组字典,其中包含每个Effect实体标识符(以便在需要时可以找到它们)和该效果的值。这可以很容易地由NSCoding自动处理,并且可以将Entity对象的数量从3600减少到可能的20。

CCD_ 18&Attack实体很少被访问(只有当生物处于战斗中时),我不需要在它们内部搜索,因此我认为这不会对性能产生明显影响。我也在许多网站上读到,他们建议不要在CoreData中存储数组和字典。有其他方法吗?如果没有,什么选择会更好?

PS:很抱歉没有描述性的标题,我不知道该放什么。

如果你不打算改变效果的种类,你可以有一个实体,你可以称之为CreatureAttack,其中每一行都完全指定了生物攻击的效果。列可能是:Creature的外键、Attack的外键、DamageConfusePoison等。对于每个效果列,一行将具有该攻击和生物的效果值。

这个实体最多只有#Creature x#Attack行,你只需拉动一行就可以了解到生物攻击的所有信息。

否则,我认为解决方案1更干净,几千行的性能影响应该可以忽略不计,尤其是如果您在Creature外键上设置索引和/或在CreatureAttack外键上设置复合索引(iOS5支持)。