2012-03-15 9 views
2

シナリオ:コンテキスト間でManagedObject IDを渡す

私は2つのviewControllerをそれぞれ独自のコンテキスト(同じスレッド)で扱っています。私はmanagedObjectのobjectIDをMOC2 - > MOC1からdelegateメソッドを介して渡そうとしています。ファイン、それは、それはObjectIDを渡しているようです。

ここは問題です... MOC1(デリゲート)から[self.localMOC objectWithID:thePassedID]経由で新しいオブジェクトへのポインタを取得します。私は見つかったオブジェクトにNSLogを実行し、ログにはそれが記述されていると思われます。現在、更新されたフェッチされた結果コントローラでそれを見つけようとすると、同じ結果コントローラを使用しているテーブルビューにオブジェクトが表示されても、それを見つけることができません。ここで

はログステートメントは、オブジェクトがobjectWithID経由...
です:<Account: 0x6b11f90> (entity: Account; id: 0x6db44b0 <x-coredata:///Account/t5F84827D-E710-4331-A462-FCA1A0D335102> ; data: <fault>)

結果コントローラオブジェクト:<Account: 0x6b1fc50> (entity: Account; id: 0x6b50250 <x-coredata://84B6642A-9C80-451F-BED4-52952EDFC43C/Account/p9> ; data: <fault>)

だけでなく、1はpermanentIDであり、他はtemporaryIDあるように思え完全に異なるメモリアドレスである。

私が間違っていることに関する手掛かりはありますか?以下は

流れです:

enter image description here

答えて

0

私はiOS5親/子MOCを利用しました。オブジェクトIDが永久IDであったにもかかわらず、コンテキスト間で異なるオブジェクトを返す理由を完全に理解できていません。完全保存後にデータを再設定しても、明らかにマージしていることがあります。時間が経つにつれて、コアデータの内部動作は徐々に私にとってより意味をなさないでしょう。しかし、提案をありがとう。

1

各管理対象オブジェクトコンテキストは、それが変更をマージすることができるよう、他のコンテキストからの通知(NSManagedObjextContextDidSaveNotification)「を保存しました」のオブザーバーとして登録する必要がありますmergeChangesFromContextDidSaveNotification: を使用して保存すると、他のコンテキストから削除されます。

+0

私は、新しい管理対象オブジェクト(またはそれの何らかの形)がテーブルビューとフェッチ結果コントローラに表示されないため、MOC 1が更新されていることを知っています。さらに、ObjectIDを渡すために、デリゲートメソッドを使用する必要があります。 – Gobot

+0

おそらく、更新があり、_updating_ですか? 2つの別々のコンテキストがあり、変更を加えたら、何らかの形でデータを同期させる必要があります。どのように現在これをやっていますか? – jrturton

+0

NSManagedObjectのリセットメソッドを介して。 ObjectIDはそれぞれの管理対象オブジェクトに固有のものだと思っていましたが、主にそのオブジェクトへの参照を取得するために使用されていました。 「ID」値がない場合、他にどのようにそのオブジェクトを取得しますか?私が混乱しているのは、オブジェクトがコンテキスト内で見つかると主張することです。 – Gobot

1

私はは、オブジェクトIDの2つの異なる形態は、最初の1(つまり/p9では終わらない、それが挿入されたが、まだ保存されていないされていますを意味していることを示していること。あなたはそれがその時点でいた、あるか?あなたは通常ことができると思いあなたのコアデータがバックアップされている.sqliteファイルをチェックしてください。(これは実装の詳細であることに注意してください。)sqlite3を使用します。select * from Z<nameOfCoreDataEntityHere> where z_pk = 9;

0

新しいオブジェクトからobjectIDを取得する前に、 は、obtainPermanentIDsForObjectsメソッドのNSManagedObjectContextを使用します。 保存するまで待たずにパーマIDを取得します。

関連する問題