2009-08-24 16 views
0

Ich habe eine CoreData-Entity (Wegpunkt) mit einem Fremdschlüssel zu einer anderen Entität (Track). Wenn der Fremdschlüssel gesetzt ist, oder wenn es nicht gesetzt ist, diese if-Anweisung funktioniert:CoreData: Überprüfung auf Null

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

Wenn jedoch die Spur, dass der Wegpunkt eingegeben wird gelöscht wurde, dann [wp track] wertet noch zu true, und das Programm stürzt ab, wenn ich den Beschriftungstext einstelle.

Also, wie überprüfe ich ordnungsgemäß für diesen "wurde gelöscht" Null-Wert in CoreData?

Antwort

6

Es klingt, als ob Sie ein Problem mit einer unidirektionalen Beziehung haben. Das Problem, das du beschreibst, wird genauer beschrieben: here unter "Unidirektionale Beziehungen"

Grundsätzlich kann dein Wegpunkt nicht wissen, dass der Track darunter gelöscht wurde. Die empfohlene Lösung besteht darin, die Beziehung als bidirektional zu modellieren, sodass Core Data die Konsistenz in Ihrem Modell beibehalten kann. Wenn Ihr "track" -Objekt eine umgekehrte Beziehung zum "waypoint" hat, dann wissen Core Data, wenn Sie das "track" -Objekt löschen, dass der Wegpunkt aktualisiert wird, um jegliches Dangling zu beseitigen Beziehungen. Mehr dazu finden Sie auch unter dem obigen Link.

0

Es ist gültig Objective-C, Nachrichten an zu senden. Sie müssen Ihre ändern, wenn Prädikat lesen:

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

Sie können auch die retainCount ein Objekt überprüfen, die 0 oder Absturz im Fall zurückkehren könnten, wenn das Objekt freigegeben wurde.

In jedem Fall kann es am besten sein, eine Art von Mitteilung zu senden, wem wp die zerstört interessiert sie dich mit dem oder wenigstens beibehalten wp bis nach Sie in diesem Code mit ihm getan.

+1

Das ändert nichts an dem aktuellen Verhalten, da das Senden einer Nachricht an nil null zurückliefert, was die 'if'-Bedingung nicht erfüllt. – bobDevil

Verwandte Themen