2012-02-08 3 views
9

私はモデルオブジェクトコンテキスト(MOC)に新しいFolderエンティティを挿入しています。これはマスターMOCの子オブジェクトです。保存する前に[[newFolder objectID] isTemporaryId]はYESを返します。最初にMOCを保存してからマスタMOCを保存し、[[newFolder objectID] isTemporaryId]に問い合わせると、もう一度YESと表示されます。私はそれが永続オブジェクトになることを期待していました。実際、SQLiteファイルに問い合わせると、新しいフォルダが含まれています。私の実行中のアプリケーションのすべての時間、それはYESと言うでしょう。私が終了して再起動する前に、ストアからオブジェクトをロードするのではなく、いいえと言います。オブジェクトは一時的ではないobjectIDをいつ取得しますか?

NSManagedObjectが一時オブジェクトから保存オブジェクトに変更されたと思っていましたが、保存時に一時オブジェクトIDがなくなりました。オブジェクトは一時的ではないobjectIDをいつ取得しますか?

乾杯

ニック

+1

私はおそらく私は "NSManagedObject * obj = [MOC existingObjectWithID:oidエラー:&エラー];使用することはできません追加する必要があります" oidは新しく挿入され保存されたフォルダの(まだ一時的な)ObjectIDです – niklassaers

+0

これまでのところ、[self.masterMOC reset]を使ってディスクへのセーブをフォローするだけです。 – niklassaers

答えて

13

オブジェクトがリフレッシュされるまで、子コンテキスト内のオブジェクトは、親コンテキストの変更によって変更されていません。おそらく、親コンテキストを保存した後にオブジェクトをリフレッシュすると、そのトリックが実行されます。

これでうまくいかない場合は、常に-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]です。

+2

変更されたのは親です。次に、子が最初に保存され、次に親が保存されます。 obtainPermanentIDsForObjectsのトリックをありがとう。しかし、私はまだオブジェクトIDが更新されない理由を知りたいと思っています。 – niklassaers

+0

私は理解します。オブジェクトを変更し、子コンテキストを保存して親コンテキストを保存します。子コンテキストを保存すると、永続IDは取得されません。私は、親コンテクストを保存するときに親コンテクストにしか影響しないので、子コンテクストは永久IDを見ないことを理論化しています。 trueの場合、オブジェクトをリフレッシュすると、子コンテキストが親から新しいIDを取得するように強制する必要があります。 –

+3

オブジェクトのリフレッシュにはどのような方法がありますか? objectIDに一時IDを使用する場合、existingObjectWithID:error:はエラーを返し、objectWithID:は同じ一時IDを持つ同じオブジェクトを返します。子と親の両方が保存された後でさえも。親のMOCをリセットするとこれが解決されますが、それは非常に高価な解決です。 – niklassaers