2010-10-15 10 views
9

Estoy intentando consultar una tabla utilizando NSPredicate. Esto es básicamente lo que estoy haciendo:NSPrecuperar el problema con el nombre de columna

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

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

NSLog imprime lo que espero ("== something_id 2"), pero el predicado no funciona. Sin embargo, el predicado funciona si lo cambio a:

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

Así que ¿por qué no este trabajo y cómo puedo solucionarlo?

+0

Eso es muy extraño ... me pasa a mí también ... –

Respuesta

30

The Predicate Programming Guide from Apple dice:

% @ es una sustitución var arg para una objeto de valor a menudo una cadena, número, o fecha.

% K es una sustitución var arg por una ruta clave.

Cuando las variables de cadena se sustituyen en una cadena de formato usando % @, que están rodeados de comillas. Si desea especificar un nombre de propiedad dinámico, use % K en la cadena de formato.

Así, en su caso, es necesario poner% K como una ruta de acceso clave a columnName, no @% que se añadirá entre comillas:

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

Esperanza esta despejar sus dudas.

+0

FWIW probablemente desea utilizar% K en ambos lados del predicado, ya que las sustituciones enteras se envolverán erróneamente entre comillas dobles. – ImHuntingWabbits

+0

No, el valor no es un número entero, pero es un NSNumber, como puede ver en la documentación, es el formato correcto. –

+0

Gracias, me salvó de un dolor de cabeza doloroso. :) –

1

muy raro, pero creo que lo he resuelto de la siguiente manera:

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

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

Si alguien puede arrojar algo de luz sobre por qué sucede esto, estaría muy agradecido. – henryeverett

+0

Porque aquí le das "something_id == 2", si permites que el predicado formatee la cadena, mostrará esto: "something_id" == 2, por lo que el campo se convertirá en una cadena y no en un campo sin comillas – Climbatize

Cuestiones relacionadas