0

元の質問に回答しました。更新は、コメントで提起された関連する質問に対処します。

元の投稿:

Apple のCoreDataBooksで使用されている MOC 保存メソッドを使用しています。ただし、2 層の MOC マージ (3 番目が 2 番目とマージされ、次に 2 番目が 1 番目とマージされる 3 つの MOC) を使用しているようです。

まず、学校のクラスを一覧表示するテーブルビュー (ClassList) があります。クラスを選択すると、2 行のテーブルビュー (AddClass) がプッシュされます。AddClass の最初の行で、ユーザーはクラスのタイトルを編集できます。2 番目の行を選択すると、そのクラスの学生名簿を表示するテーブルビュー (ClassRoster) がプッシュされます。最後に、学生を選択すると、別の 2 行のテーブルビュー (AddStudent) がプッシュされ、ユーザーは学生の名前とユーザー名を編集できます。

デュアル MOC マージ メソッド (CoreDataBooks で採用されている managedObjectContext および addingManagedObjectContext) を使用して、クラスを正常に追加および保存できます。最初のビューで「ベース MOC」を「MOC1」と呼び、「スクラッチパッド」MOC を「MOC2」と呼びます。

MOC2 は、クラス オブジェクトに加えられた変更を一時的に格納します。-didFinishWithSave:(BOOL)これらの変更は、デリゲートに を送信して、保存またはキャンセルすることができます。保存すると、MOC2 で行った変更が MOC1 にマージされます。そのマージは完全に機能しています。

学生オブジェクトに加えられた変更の処理は、私が間違っているところです。私は、MOC2 とマージされる学生オブジェクトへの変更のためのスクラッチパッドとして MOC3 を使用できると考えました (学生オブジェクトを保存したとき)。クラス オブジェクトを保存したときに、MOC2 を MOC1 と一緒に保存できます。

しかし、MOC3 を保存し、学生オブジェクトをクラス オブジェクトに追加すると、コンテキストが異なるため、エラーが発生しました。コードを投稿することはできますが、最初に、より大きな質問をしたいと思いました。これは間違った方法で行っているのでしょうか?

アップデート:

Zarra 氏は、MOC を使用initWithEntity:insertIntoManagedObjectContext:して nil に設定し、後で MOC を設定して保存できる一時オブジェクトを作成することを推奨しました。

彼のアドバイスに従って、次のコードを組み込むことを試みています。

    NSManagedObjectModel *managedObjectModel - [[managedObjectContext persistentStoreCoordinator] managedObjectModel];
    NSEntityDescription *entity = [[managedObjectModel entitiesByName] objectForKey:@"MyClass"];
    MyClass *newClass = [[MyClass alloc] initWithEntity:entity insertIntoManagedObjectContext:nil];

エラーが発生しましたが、このコードに関連しているかどうかはまだわかりません。見つけたものをデバッグして投稿します。

4

1 に答える 1

1

はい。複数使用する必要はありませんNSManagedObjectContext。その例は非常に貧弱です。あなたの場合、単一のコンテキストを使用する必要があり、それによってすべての問題が削除されます。

一時エンティティが必要な場合は、 nil で作成しますNSManagedObjectContext。保存したいときは、 を呼び出して保存-setManagedObjectContext:しますNSManagedObjectContext

現実的に複数を使用したいのNSManagedObjectContextは、マルチスレッドの状況にあるときだけです。

于 2010-08-10T21:58:43.000 に答える