3

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 との何らかの統合を設定できることは知っています。自動コーディネーターが作成時にモデルにアクセスして、編集できないようにする可能性があると思います。

私はこれらのオプションを掘り下げ続けますが、誰かがこれを経験したことがあれば、それは大歓迎です.

4

2 に答える 2

3

これはバグまたは文書化されていない変更です。このテストコードを実行しました:

  NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"TestManageObjectModelEdits" withExtension:@"momd"];
  NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
  NSEntityDescription *e=[[NSEntityDescription alloc] init];
  [e setName:@"PEntity"];
  NSArray *a=[mom entities];
  NSArray *b=[a arrayByAddingObject:e];
  [mom setEntities:b];
  NSLog(@"mom = %@",mom);

… iOS 4.3 および 5.0 で。4.3 で動作し、5.0 でモデル ファイルを変更できないというエラーがスローされます。

于 2011-10-21T16:17:38.750 に答える
3

私は 10 月 5 日にこの問題についてレーダーを提出し、今日、次の回答を受け取りました。

NSManagedObjectModel インスタンスで -mutableCopy を呼び出すことにより、モデルの変更可能なコピーを取得できます。

これは iOS 5 シミュレーターで動作しましたが、まだデバイスでテストしていません。NSManagedObjectModel は (ドキュメントによると) NSMutableCopying に準拠しておらず、ヘッダー ファイルに -(id)mutableCopy が記載されていないため、自分では試しませんでした。

私は 10 月に、momd ファイルのモデルを空の NSManagedObjectModel とマージして新しい NSManagedObjectModel を作成することで、この問題を回避しました。現在、momd ファイルのモデルは内部的に不変ですが、他の (コピーまたはマージによる) モデルは実際には変更可能です。

于 2012-02-07T18:38:53.483 に答える