2011-09-24 20 views
32

¿Cómo puedo comparar dos NSNumbers o NSNumber y un Integer en NSPredicate?NSPredicate compare con Integer

Traté:

NSNumber *stdUserNumber = [NSNumber numberWithInteger:[[NSUserDefaults standardUserDefaults] integerForKey:@"standardUser"]]; 
    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"userID == %@", stdUserNumber]; 

Bueno, esto no funciona ... alguien tiene una idea de cómo hacerlo? Estoy seguro de que es bastante fácil, pero no pude encontrar nada ...

Respuesta

82

NSNumber es un tipo de objeto. A diferencia de NSString, el valor real de NSNumber no se sustituye cuando se utiliza con el formato %@. Debe obtener el valor real utilizando los métodos predefinidos, como intValue, que devuelve el valor entero. Y use el sustituto de formato como %d ya que vamos a sustituir un valor entero.

El predicado debe ser,

predicateWithFormat:@"userID == %d", [stdUserNumber intValue]]; 
+0

¡Muchísimas gracias! ¿Hay una lista de todos estos% d% i% @% ... "atajos"? – wolfrevo

+1

... esto no debería marcar la diferencia. El analizador de formato de predicados verá '% d' en la cadena de formato, insertará' 'int' fuera de' va_list', y luego lo encapsulará en 'NSNumber'. –

+0

Eso es extraño porque también probé: fetchRequest.predicate = [NSPredicate predicateWithFormat: @ "ID de usuario ==% i", [[NSUserDefaults standardUserDefaults] integerForKey: @ "standardUser"]]]; Y eso no funcionó ... ¿así que tiene que ser el% d? ... De todos modos, está funcionando ahora :) – wolfrevo

2

Si está utilizando predicateWithSubstitutionVariables: y valor que desea predicado es NSNumber con un valor entero, entonces es necesario utilizar NSNumber en predicado en lugar de NSString como valor de sustitución. Eche un vistazo al ejemplo:

NSPredicate *genrePredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"genreID == $GENRE_ID"]]; //if we make only one NSPredicate if would look something like this: [NSPredicate predicateWithFormat:@"genreID == %d", [someString integerValue]]; 

NSPredicate *localPredicate = nil; 
for(NSDictionary *genre in genresArray){ 
    localPredicate = [genrePredicate predicateWithSubstitutionVariables:@{@"GENRE_ID" : [NSNumber numberWithInteger:[genre[@"genre_id"] integerValue]]}]; 
}