2012-11-02 5 views
8

Ich habe eine Lösung mit Unterabfrage gefunden, aber ich verstehe nicht, warum das, was ich zuerst versucht habe, nicht funktioniert hat.Kerndaten, NSPredate, ANY key.path == nil

Hier ist mein Datenmodell. Ich hole Ratschläge.

enter image description here

ich folgend als Prädikat tun können:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == %@", aTerrainObject]; 

, die gut funktioniert, und gibt jeden Ratschlag, wo zumindest eine seiner Bedingungen, den Geländetyp hat.

Allerdings, wenn ich versuche, dies zu tun, ist es nicht:

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

Was ich will ist jeden Ratschlag tun zurück, wo zumindest eine seiner Bedingungen keinen Geländetyp Satz hat.

Allerdings ist die folgende Arbeiten:

[NSPredicate predicateWithFormat:@"SUBQUERY(conditions, $x, $x.terrain == nil)[email protected] > 0"]; 

jemand erklären kann, warum, wenn für nil suchen, kann ich nicht die ANY Syntax verwenden?

+0

Guter Punkt hier. + 1 –

Antwort

24

Kann mir jemand erklären, warum ich bei der Suche nach Null die ANY-Syntax nicht verwenden kann?

Ja! Hier ist was los ist.

[NSPredicate predicateWithFormat:@"ANY conditions.terrain == nil"]; 

Zuerst lassen Sie uns diese brechen in die entsprechenden linken und rechten Ausdrücke:

conditions.terrain 

Dies wird berechnet, indem das SELF Objekt ausgewertet werden (eine Advice Instanz) und die valueForKeyPath:@"conditions.terrain" anfordert. Das Ergebnis dieses Schlüsselpfads wird eine Sammlung sein. Sie tun im Wesentlichen:

Advice *a = ...; 
NSSet *conditions = [a conditions]; 
NSSet *terrains = [conditions valueForKey:@"terrain"]; 

Also, Sie haben eine Sammlung von (potentiellen) Terrain Instanzen. Nun, was wissen wir über Sammlungen in Objective-C? Zum einen können sie nil nicht enthalten. Sie können nur Objekte enthalten.Dies bedeutet, dass bei der Ausführung des Abschnitts ANY des Prädikats die Elemente im Array durchlaufen werden und keine davon nil ist.

So ist Ihr Prädikat fehlgeschlagen. Ich habe versucht, mit einigen anderen Variationen zu spielen (mit [NSNull null] anstelle von nil, etc.), aber keiner von ihnen schien zu funktionieren.

Es würde daher scheinen, dass Ihre Verwendung eines SUBQUERY, um dies zu lösen, etwa so gut wie möglich ist. Ich würde wärmstens empfehlen filing a bug detailliert Ihre Erwartungen und auszudrücken, warum Sie denken, dass dies funktionieren sollte.

+1

+1 für die tiefe Erklärung. –

+0

Ausgezeichnete Antwort. Danke, dass Sie gründlich und präzise sind. –

0

Ich glaube, Sie können nil in der Abfrage nicht verwenden. Sie sollten vielleicht NULL oder das Formatzeichenfolge-Konstrukt wie "ANY conditions.terrain == %@", nil verwenden.

Was mir ein Rätsel ist, dass Ihre Unterabfrage funktioniert ...

oben Das ist nicht korrekt, da NULL und NIL können austauschbar verwendet werden.

Stattdessen gibt die NSExpression Class Reference genau Ihr Muster (mit @count) als das bevorzugte Beispiel.

Haben Sie überprüft, ob die Terrainbeziehung optional ist?

+0

Yup, es ist optional. –

Verwandte Themen