2010-10-15 29 views
9

Sto tentando di eseguire una query su una tabella utilizzando NSPredicate. Qui è essenzialmente quello che sto facendo:Problema NSPredicate con nome colonna

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

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

NSLog stampa che cosa mi aspetto ("== something_id 2"), ma il predicato non funziona. Tuttavia, il predicato funziona se cambio a:

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

Allora perché non funzionerà e come posso risolvere il problema?

+0

Questo è molto strano ... succede anche a me .. –

risposta

30

The Predicate Programming Guide from Apple dice:

% @ è una sostituzione var arg per un oggetto di valore spesso un stringa, numero, o data.

% K è una variabile var per un percorso chiave.

Quando variabili stringa vengono sostituiti in una stringa di formato utilizzando% @, sono circondati da virgolette. Se si desidera specificare un nome di proprietà dinamico, utilizzare % K nella stringa di formato.

Quindi, nel tuo caso, è necessario mettere% K come un percorso chiave per columnName, non% @ che verrà aggiunto tra virgolette:

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

Spero che questo chiarire i vostri dubbi.

+0

FWIW probabilmente vuoi usare% K su entrambi i lati del predicato, poiché le sostituzioni intere saranno erroneamente racchiuse tra virgolette. – ImHuntingWabbits

+0

No, il valore non è un numero intero, ma è un NSNumber, come puoi vedere nella documentazione, è il formato giusto. –

+0

Grazie, mi ha salvato da un doloroso mal di testa. :) –

1

Molto strano, ma penso di aver risolto facendo quanto segue:

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

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

Se qualcuno può far luce sul perché questo accada, sarei molto grato. – henryeverett

+0

Poiché qui si fornisce "something_id == 2", se si consente al predicato di formattare la stringa, verrà visualizzato questo: "something_id" == 2, quindi il campo diventerà una stringa e non un campo senza virgolette – Climbatize

Problemi correlati