4

これは私が使用しているコード行であり、問​​題を引き起こしています。

[self.managedObjectContext deleteObject:object];

そして、コンテキストを保存すると、クラッシュが発生します。

Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault'

編集:「-com.apple.CoreData.SQLDebug1」を使用してコードを実行します。

CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: DELETE FROM ZENTRY WHERE Z_PK = ? AND Z_OPT = ?
CoreData: sql: COMMIT
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCREATIONDATE, t0.ZMESSAGE, t0.ZSECTIONIDENTIFIER, t0.ZVERSION FROM ZENTRY t0 WHERE  t0.Z_PK = ? 
CoreData: annotation: sql connection fetch time: 0.0042s
CoreData: annotation: total fetch execution time: 0.0096s for 0 rows.
    CoreData: annotation: fault fulfilled from database for : 0x209010 <x-coredata://[edited out long code here]/Entry/p34>
 *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault'

これが問題のある場所を見つけるのに役立つかどうかわかりませんか?

4

1 に答える 1

10

この質問には、もう少し「コンテキスト」を提供する必要があると思います。

ただし、問題を探す場所がいくつかあります。まず、複数のManagedObjectコンテキストを使用していますか?その場合、self.managedObjectContextがobject.managedObjectContextと同じであることを確認してください。

複数のスレッドを使用していますか?その場合は、複数のMOCを使用している必要があります。「その」スレッドでのみMOCを使用していることを確認してください。

封じ込めポリシーを使用している場合、それは作成したスレッドでMOCを使用することを意味します。他の2つのうちのいずれかである場合は、performBlockまたはperformBlockAndWait内でMOCコードを実行する必要があります。

保存されているオブジェクトのオブジェクトIDを取得し、それがSQLファイルにあるかどうかを確認します。

コアデータSQLデバッグフラグをオンにして(スキームの起動時に渡される引数に「-com.apple.CoreData.SQLDebug1」を追加)、アプリの実行時にSQLステートメントがコンソールに記録されるのを確認できます。実際に何が起こっているのかを追跡するのに役立ちます。

今のところそれで十分だと思います...

編集

他のいくつかのデバッグのもの...

コンテキストを使用して、状態に関するすべてのアイデアをダンプします。挿入/削除/登録/更新されたオブジェクト、propogatesDeletesAtaaendOfEvent、retainsRegisteredObjectsなど...

基本的に、これらのタイプの問題は、特に1つのスレッドと1つのMOCのみを使用している場合、多くの情報なしで追跡することは非常に困難です...ほとんどの問題は複数のMOCやスレッドの使用に起因するためです。

于 2012-04-19T16:52:47.733 に答える