在向我的应用程序添加新的核心数据模型版本后,我执行了轻量级迁移,显然成功了。迁移的文件加载正常,但在第一次尝试通过特定关系访问属性时,应用程序崩溃并显示NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
。这种关系在迁移之前运作良好。我从这里的其他帖子知道 4294967295 确实是-1
,但我唯一可以识别的应用程序/数据中的 36 个项目是数据模型中总共有 36 个实体(作为参考,正在获取的关系的表中有 58 个项目)。
问题:
我的问题是:根据我收到的错误和我在下面完成的故障排除,是否有一种模式更改可以通过轻量级迁移,但会破坏数据,从而导致上述异常?我将尝试将迁移分解为多个版本的较小块,以隔离或避免问题,但如果能够专注于可能出现错误的特定架构更改,那就太好了。
失败:
“myobject”中的以下代码发生故障:
[[self object2] text];
object2 关系是一对一的,双向都是非可选的,并且数据模型之间的正向或反向关系都没有改变。这text
属性可能不相关,因为当错误发生时,awakeFromFetch
未到达 object2 中。如果我分配[self object2]
对于上述语句之前的变量,赋值成功并报告data: <fault>
.
数据库:
查看 sqlite3 中的数据库,我注意到以下内容:
- 每个表中正向和反向关系的索引值似乎都是正确的。
- object2 表有两列用于反向关系,而不是迁移之前的一列 (
ZMYOBJECT
和以前一样以及附加的Z2_MYOBJECT
,所有行均为空)。没有添加其他关系来解释此列。
- In the
Z_PRIMARYKEY
表,迁移后显示的所有条目-1
for Z_MAX
,而在迁移之前,它们显示空表为零,而填充表显示最大行数。手动更新Z_MAX
正确的值对解决异常没有帮助。全部Z_SUPER
值是正确的。
我建立了一个映射模型来查看自动映射是否有任何问题,但一切看起来都很好。
整体架构变化:
在数据模型的源版本中,有 14 个实体,其中只有 4 个已填充数据(该应用程序仍在开发中)。七个是顶级实体,七个是三个顶级实体的子实体。
在数据模型的目标版本中,添加了 22 个实体,其中一些是顶级实体,一些是子实体,具有数十种关系,包括一些添加到现有实体的关系。
从现有实体中删除了一些属性和关系,并添加了其他属性和关系。没有更改数据类型或关系设置,没有重命名属性或关系,也不需要特殊映射。
更新(2/25/12):当我开始研究新的中间模型时,我记得我已将许多实体的类(representedClassName)从 NSManagedObject 更改为 NSManagedObject 子类,但没有生成类文件。我并不怀疑这会导致问题,而且事实上,创建所有类文件对解决该异常没有帮助。我只是想指出这是模型之间的另一个变化。
结论:
这是一个大胆的猜测,但如果 36 个实体计数不是巧合,那么似乎当“myobject”尝试在“object2”中出错时,它没有对该表的有效引用,并且正在尝试加载表号 -1 ,导致异常。事实上,一个简单的赋值[self object2]
然而,成功并不符合这个结论。
有任何想法吗?