将新的Core Data模型版本添加到我的应用后,我执行了轻量级迁移,显然已成功完成。迁移后的文件加载正常,但在第一次尝试通过特定关系访问属性时,该应用程序崩溃,出现NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
。这种关系在迁移之前运行良好。我从其他帖子了解到,4294967295确实是-1
,但我可以在我的应用/数据中识别出36个项目的唯一情况是数据模型中有36个实体(作为参考,正在获取的关系有58个项目在其表格中)。核心数据迁移后的NSRangeException
问题:
我的问题是:根据我得到的错误,我已经做了以下的故障排除,有没有一种模式的变化,可以通过轻量级迁移,但腐败一路上的数据,导致着名的例外?我将尝试将几个版本的迁移划分为更小的块,以便隔离或避免该问题,但能够专注于可能存在错误的特定模式更改会很好。
失败:
用下面的代码中的“为MyObject”时发生该故障:
[[self object2] text];
的Object2的关系是一对一,非可选两种方式和既不向前也不数据模型之间反比关系发生了变化。 text
属性可能不相关,因为发生错误时,awakeFromFetch
未在object2中到达。如果在上述语句之前将[self object2]
分配给变量,则分配成功并报告data: <fault>
。
数据库:
在sqlite3的数据库来看,我注意到以下几点:
- 正向和反向关系的指数值似乎是在每个表是正确的。
- object2表具有两个反向关系列,而不是迁移前的列(前
ZMYOBJECT
和其他Z2_MYOBJECT
,对于所有行都为空)。没有其他关系被添加来解释这一栏。 - 在
Z_PRIMARYKEY
表中,迁移后的所有条目显示-1
为Z_MAX
,而在迁移之前,它们对于空表显示为零,对于已填充的表显示为最大行数。手动更新Z_MAX
到合适的值没有帮助例外。所有Z_SUPER
值都是正确的。
我设置了一个映射模型来查看是否有任何东西看起来与自动映射有关,但一切看起来都很好。
总体架构更改:
在数据模型的源代码版本,有共有十四实体,其中只有四个已经填充了数据(应用程序仍处于开发阶段)。 7个是顶级实体,7个是三个顶级实体的子实体。
在目标版本的数据模型中,添加了22个实体,一些顶级实体和一些子实体,有几十个关系,其中一些添加到现有实体中。
某些属性和关系已从现有实体中删除,而其他属性已添加。没有更改数据类型或关系设置,没有重命名属性或关系,也不需要特殊映射。
更新(2/25/12):当我开始研究一个新的中间模型时,我记得我已经将一些实体的类从NSManagedObject更改为NSManagedObject子类,但是没有生成类文件。我没有怀疑这会导致问题,并且实际上,创建所有类文件对异常没有帮助。我只是想指出,作为模型之间的另一个变化。
结论:
这是胡乱猜测,但如果36单位数是不是巧合,似乎在“为MyObject”试图在“对象2”故障它没有一个有效的参考对于表并且试图加载表号-1,导致异常。然而,简单的[self object2]
赋值成功的事实并不符合该结论。
任何想法?
你是如何选择你的映射模型的?关闭自动迁移后? – 2013-07-03 09:12:58
@JoãoNunes一旦禁用了自动迁移,只要源和目标散列匹配,它就会自动选择您的映射模型。只要您在创建映射模型后尚未修改数据模型,它们就应该匹配。不幸的是,有时他们不这样做,正如这里所说:(http://stackoverflow.com/questions/10894383/core-data-mapping-model-version-hashes-not-matching-to-source-model-version-hash )。打开核心数据迁移调试模式可以帮助解决未选择映射模型的问题。 – 2013-07-03 15:56:28
感谢您的提示。我为迁移添加了调试,但仍然存在问题。我在这里创建了一个问题:http://stackoverflow.com/questions/17464414/core-data-mapping-model-not-working-with-correct-hashes – 2013-07-04 07:50:55