2009-08-24 3 views
0

私は別のエンティティ(トラック)への外部キーを持つCoreDataエンティティ(ウェイポイント)を持っています。外部キーが設定され、またはそれが設定されていない場合は、このif文は正常に動作した場合:ウェイポイントがキーであることをトラックが削除されたために場合CoreData:Nullのチェック

if ([wp track]) { 
    thirdLabel.text = [NSString stringWithFormat:@"Part of Track: %@", [[wp track] title]]; 
} 

しかし、その後、[WPトラック]がまだあると評価しますtrueで、ラベルテキストを設定するとプログラムがクラッシュします。

CoreDataでこの「削除された」null値を正しく確認するにはどうすればよいですか?

答えて

6

一方的な関係に問題があるようです。あなたが記述している問題は、「単方向関係」のhereにあります。

基本的に、あなたのウェイポイントはトラックがその下から削除されたことを知る方法がありません。推奨される解決方法は、双方向に関係をモデル化することです。これにより、コアデータがモデル内で一貫性を維持できるようになります。

具体的な例では、 'track'オブジェクトが 'waypoint'に逆の関係にある場合、 'track'オブジェクトを削除すると、Core Dataはウェイポイントを更新して、関係。これについての詳細は、上記のリンクを参照してください。

0

nilにメッセージを送信するのに有効なObjective-Cです。述語が読み取ることがあれば、あなたを変更する必要があります:

if (wp != nil && [wp track]) { 
    //... 
} 

また、0を返すか、オブジェクトが割り当て解除されたとき場合にクラッシュする可能性がある、オブジェクトのretainCountを確認することができます。

wpを破棄した人から、使用したいと思っている人に何らかの通知を送信するか、少なくともこのコードで作業が完了するまでwpを保持するのが最善の方法です。

+1

nilにメッセージを送信するとnilが返されるため、現在の動作は変更されません。これは 'if'条件に失敗します。 – bobDevil