3

コア データの移行に問題があり、理解できない方法で失敗しています。

次のような古いバージョンのデータ モデルからの移行パスがあります。

  1. v1 - 初期モデル
  2. v2 - 軽量の移行が必要
  3. v3 - 軽量の移行が必要
  4. v4 - カスタム移行が必要
  5. v5 - 軽量移行

v1 - 現在からの移行を実行するための統合テストをまとめています。現在のストアを照会できる小さなヘルパーを作成し、モデルを指定して、適切なタイプの移行を実行します。これは多かれ少なかれうまくいきましたが、概念的に理解できないカスタム移行ステップでエラーが発生しました。

次の説明を持つNSMigrationManager::migrateStoreFromURLを使用しています。

指定されたソース URL のストアを宛先 URL のストアに移行し、マッピング モデルのすべてのマッピングを実行します。ソース URL にストアが存在する必要があります。移行先 URL にストアが存在しない場合は、ストアが作成されます (存在しない場合、移行は既存のストアに追加されます)。このメソッドを呼び出すと、移行元モデルと移行先モデル (およびマッピング モデル) で互換性チェックが実行されます。検証または移行中に発生した場合、このメソッドは NO を返します。

テスト ケースは v1 sqlite ストアにコピーされ、v3 に正常に自動移行され、カスタム移行で次のエラーで失敗します。

NSUnderlyingError: エラー Domain=NSCocoaErrorDomain Code=134100 「操作を完了できませんでした。(Cocoa エラー 134100。)」

UserInfo = 0x210d740 {メタデータ = { NSPersistenceFrameworkVersion = 419; NSStoreModelVersionHashes = {この投稿ではノイズになるハッシュがたくさんあります...}; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( "" ); NSStoreType = SQLite; NSStoreUUID = "0D2C0907-5F60-4EED-A61B-E726EEB0DA68"; "_NSAutoVacuumLevel" = 2; }, reason=ストアを開くために使用されたモデルは、ストアを作成するために使用されたモデルと互換性がありません

要約すると、v3 まで自動移行されたソース ストアしかありません。宛先ストアがありません。NSMigrationManager に依存して宛先ストアを作成することを望んでいました。存在しないストアとのモデルの不一致が原因で移行が失敗するというのは、私には意味がありません。何か案は?

追加のコンテキストとして、デバッグ時に、すべてのパラメーターの適切なインスタンスをメソッドに渡していることを確認しました。移行元モデルと移行先モデルが読み込まれ、カスタム移行に使用されるマッピング モデルが、移行元モデルと移行先モデルでクエリを実行することによってテスト バンドルから読み込まれました (何か問題があると失敗するため、有望な結果です)。 sqliteストアは正しく見えます。

4

1 に答える 1

1

まず、 Xcode スキームで起動時に渡される引数に-com.apple.CoreData.MigrationDebug 1を必ず追加してください。次に、出力を信用しないように注意してください!

一部のモデルとマッピング モデルの一致に問題があり、明らかにハッシュ値が正しくないため、軽量の移行には影響しません。私は現在これと戦っていますが、これを引き起こす条件を特定することはできませんでした。問題を特定できる場合は、詳細なバグを報告してください!

iOS 7 ベータ版にアクセスできる場合は、そこにあるデバッグ出力がより役立つ可能性があります。iOS 6 では、マッピング モデルとマネージド オブジェクト モデルの間でデバッグ出力のハッシュ値が常に一致するため、デバッグ出力にバグがあるようです。iOS 7 では、これが問題である場合に、どのエンティティに不一致があるかを特定し、問題を引き起こしている特性を特定できる可能性があります (これまではできませんでした)。

健全性チェックとして、バージョン 3 と 4 の間で新しいクリーンなバニラ マッピング モデルを編集せずに生成してみて、マッピング モデルと実際に生成に使用するモデルとの間で同期が取れていないことを確認することをお勧めします。お店。また、現在ライトウェイト マイグレーションを使用している 2 つのモデル間で同じアプローチを試して、それらのケースで問題が発生するかどうかを確認することもできます。これは、ハッシュ値のバグが原因である場合に予想されることです。

于 2013-07-06T04:01:44.630 に答える