新しい Core Data モデル バージョンをアプリに追加した後、軽量の移行を実行しましたが、明らかに成功しました。移行されたファイルは正常にロードされましたが、特定のリレーションシップを介して属性にアクセスしようとすると、アプリがNSRangeException: '*** -[__NSArrayM objectAtIndex:]: index 4294967295 beyond bounds [0 .. 35]'
. この関係は、移行前は正常に機能していました。ここの他の投稿から、4294967295 が実際-1
には .そのテーブル)。
質問:
私の質問は次のとおりです。発生しているエラーと以下で行ったトラブルシューティングに基づいて、軽量の移行を通過する可能性のあるスキーマ変更の種類はありますが、途中でデータが破損し、例外が発生しますか? 問題を分離または回避するために、いくつかのバージョンで移行を小さなチャンクに分割しようとしていますが、障害の可能性がある特定のスキーマ変更に集中できるとよいでしょう。
失敗:
「myobject」の次のコードでエラーが発生します。
[[self object2] text];
object2 の関係は 1 対 1 であり、どちらの方法でもオプションではなく、データ モデル間で前方関係も逆関係も変更されていません。text
エラーが発生したときawakeFromFetch
に object2 に到達していないため、この属性は関連していない可能性があります。上記のステートメントの前に変数に代入[self object2]
すると、代入は成功し、data: <fault>
.
データベース:
sqlite3 のデータベースを見ると、次のことがわかります。
- 順方向および逆方向の関係のインデックス値は、各テーブルで正しいように見えます。
- object2 テーブルには、移行前の 1 つではなく、逆の関係のための 2 つの列があります (以前のように、すべての行で空である
ZMYOBJECT
追加の )。Z2_MYOBJECT
この列を説明する他の関係は追加されていません。 - 表では
Z_PRIMARYKEY
、移行後のすべてのエントリが に表示-1
されますZ_MAX
が、移行前は、空のテーブルにはゼロが表示され、入力されたテーブルには最大行数が表示されます。適切な値に手動で更新Z_MAX
しても、例外は解決しませんでした。すべてのZ_SUPER
値が正しかった。
マッピング モデルをセットアップして、自動マッピングに問題があるかどうかを確認しましたが、すべて問題ないように見えました。
全体的なスキーマの変更:
ソース バージョンのデータ モデルには 14 個のエンティティがあり、そのうち 4 個だけがデータを取り込まれていました (アプリはまだ開発中です)。7 つはトップレベルのエンティティで、7 つはトップレベルのエンティティの 3 つのサブエンティティでした。
データ モデルのターゲット バージョンでは、最上位エンティティとサブエンティティの 22 個のエンティティが追加され、既存のエンティティに追加されたものを含む数十のリレーションシップが含まれていました。
一部の属性と関係が既存のエンティティから削除され、その他が追加されました。データ型や関係設定は変更されておらず、属性や関係の名前も変更されておらず、特別なマッピングも必要ありませんでした。
更新 (2012 年 2 月 25 日): 新しい中間モデルの作業を開始したときに、多くのエンティティのクラス (representedClassName) を NSManagedObject から NSManagedObject サブクラスに変更したことを思い出しましたが、クラス ファイルは生成していませんでした。 . それが問題を引き起こすとは思いませんでした。実際、すべてのクラス ファイルを作成しても例外は解決しませんでした。モデル間の別の変更点として、それを指摘したかっただけです。
結論:
これは大雑把な推測ですが、36 個のエンティティ数が偶然ではない場合、"myobject" が "object2" で失敗しようとすると、テーブルの有効な参照がなく、テーブル番号 -1 をロードしようとしているようです。 、例外を引き起こします。ただし、単純な割り当てが成功したという事実は、[self object2]
その結論とは一致しません。
何か案は?