2010-09-29 17 views
8

Hola tengo la base de datos Core Data con atributos numéricos. son NSNumbers. El valor por defecto es 0.0, pero cuando intento hacer algo de NSPredicated buscar, me sale " 'NSInvalidArgumentException', razón: 'predicado no válido: nil RHS'" sólo porque el valor del atributo es de 0,0NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone)

El predicado se crea con:

[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)",startNSNumber,endNSNumber, idString] 

¿cómo puedo resolver este problema?

+1

Por favor, publique cómo está creando el predicado. –

+0

Proporcione el código que usa para hacer el predicado. – ohhorob

+0

predicado: [NSPredicate predicateWithFormat: @ "(startValue =>% @) AND (endValue <% @) AND (someId ==% @)", startNSNumber, endNSNumber, idString] – Greg

Respuesta

5

¿Está agregando los flotadores como objetos, no como flotadores? Prueba esto:

[NSPredicate predicateWithFormat:@"(startValue => %f) AND (endValue <= %f) AND (someId == %@)",startNSNumber,endNSNumber, idString]; 
+0

Si es NSNumber, esto claramente no funcionará. – Eiko

+1

'% f' se usa para una primitiva 'flotante'. 'NSNumber' es un objeto (lo que significa que'% @ 'es la sustitución correcta para él). –

+0

explosiva, leí mal la pregunta y pensó que estaba añadiendo flotadores :( – deanWombourne

1

Bueno, dado el predicado que ya ha proporcionado, la respuesta fácil es:

De cualquier startNSNumber, endNSNumber o idString es nula. Si desea comparar algo en contra de nil en un NSPredicate, debe sustituir en [NSNull null], no en nil.

+0

así que si (startNSNumber) { [NSPredicate predicateWithFormat: @ "(valorlnicial =>% @), startNSNumber] } else { [NSPredicate predicateWithFormat: @ "(startValue =>% @), [NSNull null] } ?? ¿Será correcto?! – Greg

+0

no, es NSInvalidArgumentException nuevamente:/ – Greg

2

Creo firmemente una de las variables es nula o se autoreleased ...

probar esto:

NSNumber *num1 = [NSNumber numberWithFloat:2.0]; 
NSNumber *num2 = [NSNumber numberWithFloat:3.0]; 
NSString *str = @"Test"; 
[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)", num1, num2, str]; 

Si esto sucede que el problema es con las variables.

Si espera sea num1 o num2 ser nil veces, entonces se podría reescribir el predicado como:

[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)", num1 ? num1 : [NSNumber numberWithFloat:0.0], num2 ? num2 : [NSNumber numberWithFloat:0.0], idString]; 
+0

sí -.- 'mi problema es cuando num1 o num2 es [NSNumber numberWithFloat: 0.0 ] pero este valor es posible y necesario, pero NSPredicate no le gusta. arroja excepciones. ¿Por qué ?! – Greg

+0

que es bastante sorprendente, ¿está seguro de que la variable no es 'nil'? He ejecutado un código de prueba con un salto point y '[NSNumber numberWithFloat: 0.0]' genera un objeto 'NSNumber' adecuado ... – Nick

+0

sí, desafortunadamente estoy totalmente seguro :( – Greg

0

EN NSpredicate valor de cadena uso como flotar el diccionario key.floatValue y fácil de usar.

[NSPredicate predicateWithFormat:@"(startValue.floatValue => %f) AND (endValue.floatValue <= %f) AND (someId == %@)",startNSNumber,endNSNumber, idString] 

Creo que esta publicación es útil.