5

新しいモデルを追加しようとしています。新しいモデルには、1つの新しいエンティティと、現在のエンティティから新しいエンティティへの関係があります。新しいモデルを作成し、現在のモデルとして設定しました。すべてが正常に機能し、新しいエンティティにアクセスできますが、一部の「バイナリデータ」エントリはnilです。

マッピングモデルを追加してから移行しようとしましたが、結果は同じです。保存される「バイナリデータ」はUIImageです。いくつかの小さなサムネイルが移行されています。フルサイズのUIImageはどれも移行されていません。

(サイズが原因で)外部に自動的に保存されるエンティティは移行されていないのではないかと思います。

アップデート

画像コレクションを保存する小さなプロジェクトを作成します。新しいモデルを作成しようとしましたが、すべて正常に機能しました。次に、新しいプロジェクトを古いプロジェクトと比較します。唯一の違いは「外部ストレージを許可する」でした。新しいプロジェクトでこのオプションを選択し、新しいモデルを作成しましたが、写真がありませんでした。

4

1 に答える 1

13

外部に自動的に保存されるエンティティ (サイズが原因) が移行されていないのではないかと考えています。

それはまさに何が起こるかです。アップルのバグです。特定のサイズを超えるバイナリ データは、Core Data によって Documents フォルダー内の外部サポート フォルダーに保存されます。なんらかの理由で、移行中に Core Data はその外部ストレージ フォルダーを消去するだけです。そのため、サムネイル画像データは SQLite DB の外部に保存されていないため、問題なく移行されますが、より大きな外部バイナリ ファイルは削除されるだけです。

私が思いついた解決策は、コードが Core Data モデルの永続ストア コーディネーターを初期化するときに、自動移行を試みる前にいくつかのチェックを実行することです。新しいモデルが現在保存されているモデルと互換性があるかどうかを確認します。そうでない場合は、Core Data が古いモデルを新しいバージョンに移行しようとしており、その際に外部ストレージ フォルダーが消去されることがわかります。その前に、外部ストレージ フォルダを一時的な場所に移動するだけです。移行が完了したら、Core Data によって生成された新しい空の外部ストレージ フォルダーを置き換えます。

このブログ投稿で、ソース コードを使用して完全なソリューションを文書化しました。

http://www.nickkuh.com/iphone/core-data-migration-woes-with-binary-data-and-external-storage-data-loss/2012/06/

于 2012-06-09T14:22:32.997 に答える