CoreData:大量实体或将数组存储为Transformable?

时间:2012-09-08 06:00:39

标签: ios core-data nscoding

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

可以通过三个实体看到我的问题的一个基本示例:

  1. Creature:包含与Attack实体
  2. 的多对多关系
  3. Attack:包含与Effect实体
  4. 的多对多关系
  5. Effect:包含效果的详细信息(损坏,混淆,毒药等)
  6. 首先,我需要为每个唯一的Attack实体提供三个唯一的Creature个实体。然后我需要为每次攻击添加Effect个实体。我的问题是每个效果可以有不同的值,但它与所有其他生物的效果基本相同:它仍然是“伤害”,但伤害的值与每个生物不同。

    我只想到这两种方式:

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

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

    3. Entity& Effect实体很少被访问(只有当生物在战斗中时)并且我不需要在其中搜索,因此我认为这不会对性能产生明显的影响。我还在许多网站上看到他们建议不要在CoreData中存储数组和字典。有没有其他方法这样做?如果没有,哪种选择会更好?

      PS:对于非描述性标题,我不知道该放什么。

1 个答案:

答案 0 :(得分:0)

如果您不打算更改效果的类型,您可以拥有一个可以调用CreatureAttack的实体,其中每行完全指定生物攻击的效果。列可能是:Creature的外键,Attack的外键,DamageConfusePoison等。对于每个效果列a row将具有此攻击和生物的效果值。

此实体最多只有#Creature x#Attack行,您只需拉一行即可找到有关生物攻击的所有信息。

否则我认为解决方案1更清晰,几千行的性能损失应该可以忽略不计,特别是如果你在Creature外键和/或{{1}上的复合索引上放置一个索引}和Creature外键(在iOS5中受支持)。