CoreData を使用する私の iOS アプリケーションでは、特定のエンティティ プロパティがアプリの iPhone バージョンと iPad バージョンの間で異なるモデルが必要です。これを実現するために、initWithContentsOfURL: を使用して、アプリケーション バンドルにある momd ファイルから NSManagedObjectModel を読み込みます。ただし、モデルが storeCoordinator によって実際に使用される前に、モデル内のいくつかのエンティティをプログラムで変更します (デバイス固有の plist に保存した情報に基づいて)。これは iOS4 で問題なく動作していました。Apple がドキュメントで述べているように、
管理対象オブジェクト モデルは、オブジェクト グラフ マネージャー (管理対象オブジェクト コンテキストまたは永続ストア コーディネーター) によって使用されるまで編集可能です。
これは、iOS5 には当てはまらないようです (ただし、ドキュメントにはまだ記載されています)。モデルが作成されるとすぐに、initWithContentsOfURL: を使用して、たとえば、変更しようとすると、'NSInternalInconsistencyException' がスローされます。作成直後にデバッガーでモデル オブジェクトの説明を出力すると、「isEditable 0」と表示されます。iOS4 で同じコードを実行すると、「isEditable 1」と表示されます。
Apple が提案するように、モデルで「コピー」を使用して編集可能なコピーを作成すると、「isEditable 0」のモデルも返されます。
これについては、次の 2 つの説明が考えられます。
- バグ 。openradar で一致するバグレポートが見つかりませんでした。必要に応じて報告します。
- iCloudの統合。私はまだ iCloud API にあまり詳しくありませんが、CoreData との何らかの統合を設定できることは知っています。自動コーディネーターが作成時にモデルにアクセスして、編集できないようにする可能性があると思います。
私はこれらのオプションを掘り下げ続けますが、誰かがこれを経験したことがあれば、それは大歓迎です.