2011-08-16 11 views
0

私はシングルトンに(managedObjectとして)プロパティを持っています。このオブジェクトのプロパティは更新され(削除され、カスタムIDを持つ新しいオブジェクトが作成され、古いオブジェクトのIDと等しくなります)、次にコンテキストを保存し、プロパティを無効にして新しいオブジェクトを取得し、プロパティに割り当てます。CoreData。無効なオブジェクトを正常に保存しました

私はエラーはありませんでしたが、すべて正常でした。アプリケーションを再起動した後、私は「CoreDataは障害を達成できませんでした」という例外を得ました。私はsqliteBrowserでデータベースを開き、そこに古いオブジェクトと新しいオブジェクトを見ました。新しいオブジェクトが正しいです。古いオブジェクト(削除されるべきもの)は、削除されたオブジェクトとの関係を持ちます。

また、異なるスレッドがオブジェクトを更新するときに、UIはmanagedObjectのプロパティにアクセスできます。

どのように発生する可能性がありますか?そしてこれを防ぐ方法は?私は "CoreDataがフォールトを満たすことができませんでした"というcoreDataのトラブルシューティングを読んでいます。私は例から私の問題を発見しなかった。

私はこれについて非常に混乱しました。私はアイデアを持っていますが、それは良い方法ではありません: プロパティをmanagedObjectではなくid(カスタムID、NSNumber)、owerload setterおよびgetterとするとどうでしょうか。 Setterは同じオブジェクトを受け取りますが、カスタムIDにアクセスしてプロパティのIDを割り当てます。 Getter - idでオブジェクトをフェッチし、プロパティに保存します。 GetterとSetterはNSLockを開始時にロックし、最後にNSLockをロック解除します。オブジェクトを更新するスレッドは、更新と保存が終了するまでロックをロックします。 大きな感謝!

P.S. 私は大変申し訳ありませんが、私は通常、深刻な理由で自分のコードを表示することはできません。

答えて

1

管理対象オブジェクトに設定されたクラスのプロパティを無効にしても、管理対象オブジェクトはコンテキストやストアから削除されません。オブジェクトはメモリとストアに存続し、コンテキストがオブジェクトを削除するまでストアに設定した関係を維持します。

oldObjectには、削除した他のオブジェクトを指す関係があるため、「エラーを満たすことができません」というエラーが発生しています。これは、ターゲット・オブジェクトが除去されたときに関係を壊さない不適切なデータ・モデル構成によって引き起こされます。削除ルールを確認してください。 1つはNo Actionに設定する必要があります。

は、実際に削除するにはoldObjectあなたのような何かを明示的に削除するには、コンテキストを伝える必要があり、次のいずれか

[myManagedObjectContext deleteObject:oldObject]; 

...またはcascade削除規則を使用して、それを削除するには、他のエンティティの関係を設定します。

+0

しかし、私は本当にコンテキストでオブジェクトを削除し、すべての削除ルールをチェックし、すべてのルールが "カスケード"または "無効化"に割り当てられていることを確信しました。 – Arsynth

+0

削除後にコンテキストを保存しましたか?ストアは、コンテキストを保存するまで変更されません。 – TechZen

+0

はい、私はしました。そして、古いオブジェクト、削除されたグラフとの関係は、まだ生きている間違いで店に残っています。すべての時間ではなく、まれに同じユーザーの操作で発生します – Arsynth

関連する問題