2010-10-15 12 views
9

Ich versuche, eine Tabelle mit NSPredate abzufragen. Hier ist im Wesentlichen, was ich tue:NSPredicate Problem mit Spalte Name

NSNumber *value = [NSNumber numberWithInteger: 2]; 
NSString *columnName = @"something_id"; 

NSLog(@"%@ == %@", columnName, value); 
NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%@ == %@", columnName, value]; 

NSLog ausdruckt, was ich erwarte („something_id == 2“), aber das Prädikat nicht funktioniert. jedoch das Prädikat funktionieren, wenn ich es zu ändern:

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"something_id == %@", value]; 

warum so wird diese Arbeit nicht, und wie kann ich es beheben?

+0

Das ist sehr seltsam ... passiert mir auch .. –

Antwort

30

The Predicate Programming Guide from Apple sagt:

% @ ist eine var arg Substitution für einen Objektwert-oft ein Zeichenfolge, Nummer, oder Datum.

% K ist eine var arg Substitution für einen Schlüsselpfad.

Wenn String-Variablen in einen Format-String ersetzt werden mit% @, sie von Anführungszeichen umgeben sind. Wenn Sie einen Namen für dynamische Eigenschaften angeben möchten, verwenden Sie % K in der Formatzeichenfolge.

Also, in Ihrem Fall, müssen Sie% K als Schlüsselpfad zu column, nicht% @ setzen, die mit Anführungszeichen hinzugefügt werden:

NSPredicate *refQuery = [NSPredicate predicateWithFormat: @"%K == %@", columnName, value]; 

Hope this klar Ihre Zweifel.

+0

FWIW werden Sie wahrscheinlich möchte% K auf beiden Seiten des Prädikats verwenden, da Integer-Substitutionen fälschlicherweise in doppelte Anführungszeichen eingeschlossen werden. – ImHuntingWabbits

+0

Nein, Wert ist keine ganze Zahl, aber es ist eine NSNummer, wie Sie in der Dokumentation sehen können, es ist das richtige Format. –

+0

Danke, rettete mich vor schmerzhaften Kopfschmerzen. :) –

1

Sehr seltsam, aber ich glaube, ich es gelöst haben, indem Sie die folgenden Schritte aus:

NSNumber *value = [NSNumber numberWithInteger: 2]; 
NSString *columnName = @"something_id"; 

NSString *predicate = [NSString stringWithFormat: @"%@ == %@", columnName, value]; 
NSPredicate *refQuery = [NSPredicate predicateWithFormat: predicate]; 
+0

Wenn jemand etwas Licht auf warum dies geschieht, würde ich sehr dankbar sein. – henryeverett

+0

Da hier geben Sie "Something_id == 2", wenn Sie Prädikat formatieren die Zeichenfolge, wird es ausgeben: "Something_id" == 2, so wird das Feld zu einer Zeichenfolge und kein Feld ohne Anführungszeichen – Climbatize