40

私のアプリはCoreDataを使用しており(Magical Recordの助けを借りて)、を使用してかなりマルチスレッド化されてNSOperationいます。

もちろん、私はNSManagedObjectIDスレッド/操作の間だけを通過するように非常に注意しています。

ここで、操作で対応する管理対象オブジェクトに戻るために、次の-existingObjectWithID:error:ように使用します。

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

しかし、私が返すのはnilであり、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.

私の場合、これは真実ではありません。そのオブジェクトは存在します。Collection確かに、そのエンティティのすべてのインスタンスを。で繰り返すNSFetchRequestと、それらの中にそれが見つかり、それNSManagedObjectIDはまさに私が渡したもの-existingObjectWithID:error:です。

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

だから私が欠けているものがあります。ここにいくつかの追加の観察/質問があります:

  • 「存在しないオブジェクト」:その文の「存在する」の意味は何ですか?「存在する」どこ?その時点で、それは間違いなく私のCoreDataストアに「存在」します。
  • 「障害に対応するオブジェクトが見つかりません」:その文で「見つかった」の意味は何ですか?「見つかった」どこ?その時点で、私のCoreDataストアで間違いなく「見つかりました」。

だから多分私は何をするかに関して何かが欠けて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か?

悟りをありがとう。

4

5 に答える 5

40

問題は、NSManagedObjectIDパスが一時的なものであるということです。NSManagedObjectIDisTemporaryIDメソッドを呼び出すことで確認できます。ドキュメントから:

受信者が一時的であるかどうかを示すブール値を返します。

ほとんどのオブジェクトIDはNOを返します。管理対象オブジェクトコンテキストに挿入された新しいオブジェクトには一時IDが割り当てられ、オブジェクトが永続ストアに保存されると、永続IDに置き換えられます。

最初に変更を永続ストアに保存してから、他のコンテキストに渡すための永続的なIDを取得する必要があります。

于 2014-02-20T14:21:59.623 に答える
8

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

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

于 2011-12-27T16:28:10.890 に答える
2

NSManagedObjectReferentialIntegrityError = 133000

NSManagedObjectReferentialIntegrityError存在しないオブジェクトを指す障害を発生させようとする試みを示すエラーコード。ストアにアクセスできますが、障害に対応するオブジェクトが見つかりません。Mac OSXv10.4以降で利用できます。CoreDataErrors.hで宣言されています。

このドキュメントを参照してください。

このチュートリアルはあなたに役立つかもしれません。

したがって、考えられる理由は、存在しないオブジェクトをフェッチしようとしていることです。これは通常、存在しないオブジェクトのオブジェクトIDを作成しようとしたときに発生します。objectidが返され、このobjectIdを使用してオブジェクトを取得しようとすると、この例外がスローされます。

于 2012-02-15T10:00:36.353 に答える
0

NSManagedObjectContextDidSave通知を処理しているときにそれらを見つけました。別のコンテキストで削除されたオブジェクトの多くは、(Duh!)削除されたため、フェッチできませんでした。ただし、現在のコンテキストですでに障害が発生しているオブジェクトのように、削除されたオブジェクトの一部は問題なく表示されました。

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

于 2014-10-17T23:03:19.267 に答える
0

objectIDが一時的ではないのに、この問題が発生しました。これは、親を子MOCに設定するのを愚かに忘れたためです。

childManagedObjectContext.parent = managedObjectContext

于 2019-12-04T19:06:45.770 に答える