2011-12-26 10 views
38

私のアプリは(魔法の記録の助けを借りて)コアデータを使用し、NSOperationを使用してかなり重いマルチスレッドです。コアデータ-existingObjectWithID:エラー:エラー133000を引き起こします

もちろん、スレッド/操作の間でのみNSManagedObjectIDを渡すことに非常に注意しています。

は今、バック操作で対応する管理対象オブジェクトを取得するには、私はこのように-existingObjectWithID:error:を使用します。

Collection *owner = (Collection *)[localContext existingObjectWithID:self.containerId error:&error]; 

しかし、私は戻って取得することは皆無であるとerrorが、これはエラー#13300であると言います:NSManagedObjectReferentialIntegrityError。ここで

は、ドキュメントは、このエラーについてこう言われる、

私の場合は当てはまりません
NSManagedObjectReferentialIntegrityError 
Error code to denote an attempt to fire a fault pointing to an object that does not exist. 
The store is accessible, but the object corresponding to the fault cannot be found. 

:そのオブジェクトが存在します。実際、NSFetchRequestというエンティティのすべてのインスタンスを反復すると、私はそれを見つけることができます。NSManagedObjectIDは、-existingObjectWithID:error:に渡したものとまったく同じです。

さらに、私が-objectWithID:を代わりに使用すると、正しいオブジェクトが正しく返されます。

私には何かがありません。いくつかの追加の観察/質問があります:

  • 「存在しないオブジェクト」:その文には「存在する」という意味はありますか? 「存在する」どこ?その時点で私のコアデータストアには「存在する」ことは間違いありません。
  • "障害に対応するオブジェクトが見つかりません":その文で "found"の意味は何ですか? "見つけた"どこ?その時点で、私のコアデータストアには必ず "見つかる"ことがあります。

だから、existingObjectWithID:error:について何か不足していますか?ドキュメントには:

If there is a managed object with the given ID already registered in the context, that object is returned directly; otherwise the corresponding object is faulted into the context. 
[...] 
Unlike objectWithID:, this method never returns a fault. 

これは私の問題を助けるものではありません。私は自分の物体が完全に故障しているのではなく、故障ではない。実際には、オブジェクトプロパティにアクセスすると、その中のどのフォルトも次のコード行で発生します。

  • NSManagedObjectReferentialIntegrityErrorにつながる現実的なシナリオは何ですか?

ありがとうございました。

+2

あなたはこれを理解しましたか?私は同じ問題を抱えています。私のオブジェクトは間違いなくそこにあり、セーブ操作は実行中ですが、散発的にしか発生しません。 – Adam

答えて

36

問題はNSManagedObjectIDが通過するのが一時的です。あなたはNSManagedObjectIDisTemporaryIDメソッドを呼び出すことによってそれをチェックすることができます。ドキュメントから:

Returns a Boolean value that indicates whether the receiver is temporary.

Most object IDs return NO. New objects inserted into a managed object context are assigned a temporary ID which is replaced with a permanent one once the object gets saved to a persistent store.

あなたはまず、変更内容を保存する必要があり永続ストアに、唯一の永久的なIDを取得し、他のコンテキストに渡します。

8

複数のコンテキストを使用している場合は、コンテキストAから管理対象オブジェクトIDを渡す前に、コンテキストAを別のコンテキストBに渡す必要があります。保存が完了すると、そのオブジェクトはコンテキストBからアクセスできます。

-objectWithID:は常にnil以外のオブジェクトを返しますが、ストアにバッキングオブジェクトがない場合は、使用を開始すると例外がスローされます。 -existingObjectWithID:error:は実際にSQLを実行し、そのオブジェクトがまだ使用されているコンテキストに登録されていない場合はI/Oを実行します。

+2

それはそうではありません:私は '-objectWithID:'を使うと、私は正しいオブジェクトを得ました。私はそれを使用して、プロパティ、その関係、すべてにアクセスできます。そして、実際には、以前に作成されたコンテキストが保存されました。しかし、 '-existingObjectWithID:error:'はエラー133000で失敗します。 –

+0

本当に奇妙な音です。両方のコンテキストが同じNSPersistentStoreCoordinatorを共有していますか? –

+1

私はmanagedObjectContextをリセットすることでこれを "解決"しました。確かに理想的ではないので、私は他の解決策を聞くことを楽しみにしています: – niklassaers

2

NSManagedObjectReferentialIntegrityError = 133000

NSManagedObjectReferentialIntegrityError Error code to denote an attempt to fire a fault pointing to an object that does not exist. The store is accessible, but the object corresponding to the fault cannot be found. Available in Mac OS X v10.4 and later. Declared in CoreDataErrors.h.

これを参照してくださいdocumentationを参照してください。

This tutorialが役に立ちます。

したがって、存在しないオブジェクトをフェッチしようとしている可能性があります。これは、既存のオブジェクト以外のオブジェクトIDを作成しようとすると一般的に起こります。 objectidが返され、このobjectIdでオブジェクトを取得しようとすると、この例外がスローされます。

0

NSManagedObjectContextDidSave通知を処理している間にそれらを検出しました。別のコンテキストで削除されたオブジェクトの多くは、削除されたため(Duh!)取り出されませんでした。しかし、削除されたオブジェクトのいくつかは、現在の状況で既にフォールトしたもののように、うまく表示されました。

同様の問題が発生する可能性があります。ストアを反復するときに見つかったオブジェクトは、削除される前にそのコンテキストにフォールトされていて、そのコンテキストに変更をマージしていないか、かなり合併した。

関連する問題