在向我的应用程序添加新的 Core Data 模型版本后,我执行了轻量级迁移,显然是成功的。迁移的文件加载正常,但在第一次尝试通过特定关系访问属性时,应用程序崩溃并显示NSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
. 这种关系在迁移之前运行良好。我从这里的其他帖子中知道 4294967295 确实-1
是它的表)。
问题:
我的问题是:根据我遇到的错误和我在下面完成的故障排除,是否有一种模式更改可以通过轻量级迁移,但在此过程中会破坏数据,导致注意到的异常?我将尝试将迁移分解为多个版本的较小块,以隔离或避免该问题,但如果能够专注于可能有问题的特定架构更改,那就太好了。
失败:
失败发生在“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
值都是正确的。
我建立了一个映射模型,看看自动映射是否有任何问题,但一切看起来都很好。
总体架构更改:
在数据模型的源版本中,有 14 个实体,其中只有 4 个已填充数据(该应用程序仍在开发中)。七个是顶级实体,七个是三个顶级实体的子实体。
在数据模型的目标版本中,添加了 22 个实体,一些顶级实体和一些子实体,以及数十种关系,包括一些添加到现有实体中的关系。
从现有实体中删除了一些属性和关系,并添加了其他属性和关系。没有更改数据类型或关系设置,没有重命名属性或关系,也不需要特殊映射。
更新(2/25/12):当我开始研究一个新的中间模型时,我记得我已经将许多实体的类(representedClassName)从 NSManagedObject 更改为 NSManagedObject 子类,但没有生成类文件. 我不怀疑这会导致问题,事实上,创建所有类文件并没有帮助解决异常。我只是想指出这是模型之间的另一个变化。
结论:
这是一个疯狂的猜测,但如果 36 个实体计数不是巧合,似乎当“myobject”试图在“object2”中出错时,它没有对表的有效引用并试图加载表号 -1 ,导致异常。然而,一个简单的分配[self object2]
成功的事实并不符合这个结论。
有任何想法吗?