注: 私の問題の根本的な原因は、データ モデルのバージョンを追跡するために、Xcode4 がバージョン番号の代わりに使用するプライベート ハッシュを誤って更新していることだと思います。おそらく、誤って何かを追加してから削除したため、ハッシュが変更された可能性があります。元のモデルは非常に単純で、目で簡単に比較でき、違いはありませんでした。
また、より一般的に言えば、問題は Xcode4がまだCoreData プロジェクトを適切に処理しないことです。デフォルトで CoreData モデルを「バージョン管理された」ものとして作成します (役に立たないモデルを常に作成する運命にあった Xcode3 からの大幅な改善)。モデルの変更を処理しない- 変更を保存する前に手動でバージョンを更新することを忘れないでください (そうしないと、すべてのプロジェクトの移行が永遠に失敗し、解決策がありません)。
また、問題が発生すると、「正しい」解決策を見つけることができませんでした.AppleのCore Data libから欠落している部分が多すぎます. 基本的に: 私の知る限り、NSPersistentDocument は不完全で、サポートされていません。
最終的に、私は次の残忍な回避策を採用しました。古いバージョンを使用しているすべての人に、CoreData ストアを手動で編集して、現在のバージョンを実行していると主張するように指示しました。
これは 100% 機能します。CoreData とは異なり、私のアプリは、インポート時に明らかな欠落データをインテリジェントに修正するように作成されているためです。些細なことですが、CoreData では、「はい、これを実行しました。問題ありません。ファイルを開いてください」とは言えません。
- 古いバージョン: 「XML として保存」
- ファイルの先頭にコピー/貼り付けする新しいヘッダーを提供しました。注: Apple はバージョン番号の代わりにハッシュを使用しているため、実際にはそうではありませんが、これは恐ろしく見えます。Apple が独自のバージョン システムを無視し、代わりにハッシュを使用している理由がわかりません。
- 新しいバージョン: 更新されたファイルを開きます
- 新しいバージョンでは: 「保存」
...そして、NSManagedObject メソッドをオーバーライドしているため:
-awakeFromInsert
上記の手順 3 と 4 により、データが「自動的に」更新されます。
マッピング モデルを作成するのが「正しい」方法であることはわかっていますが、ほとんどの場合、これは非常にやり過ぎです...そして、Apple は最初から古いデータの読み込みを拒否していました。つまり、Core Data は、データの修正を許可することさえ拒否していました - 私のコードは喜んで修正していたにもかかわらずです。
(すべての古いプロジェクトは正しくインポートおよびエクスポートされました - 問題ありません)
IMHO: CoreData は、最初は考えられなかったすべてのエッジケースを修正するために、Apple 側で再設計する必要があります。
NB: 簡単な警告: awakeFromFetch 内の CoreData 変数を変更しないでください - Apple は、そのメソッドを呼び出す前に変更追跡を一時的に無効にします (これはちょっとばかげています - メソッドが他のすべての "awakeFrom*" の動作と互換性がなくなります)メソッド)。
Apple のアドバイス: awakeFromFetch 内で、何を変更するかを決定し、それをパッケージ化して、次のようなものを使用します。
[self performSelector:@selector(myAwakeFromFetchFixItemX:) withObject:X afterDelay:0.01];
...これを試している人のためにそれを追加すると思いました-そうしないと、インポートは正常に機能しますが、エクスポートは黙って固定データを含めることができません!