2010-09-29 41 views
8

salut j'ai la base de données de base de données avec les attributs numériques. ils sont NSNumbers. La valeur par défaut est 0.0 mais lorsque je tente de faire quelques NSPredicated Fetch, je reçois « « NSInvalidArgumentException », la raison:« prédicat non valide: nulle RHS » juste parce que la valeur de l'attribut est 0.0NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone)

Le prédicat est créé avec:

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

comment puis-je résoudre ce problème?

+1

Veuillez indiquer comment vous créez le prédicat. –

+0

Veuillez indiquer le code que vous utilisez pour créer le prédicat. – ohhorob

+0

prédicat: [NSPredicate predicateWithFormat: @ "(startValue =>% @) ET (endValue <% @) ET (someId ==% @)", startNSNumber, endNSNumber, idString] – Greg

Répondre

5

Vous ajoutez les flottants en tant qu'objets et non en tant que flottants? Essayez ceci:

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

Si c'est NSNumber, cela ne fonctionnera évidemment pas. – Eiko

+1

'% f' est utilisé pour une primitive' float'. 'NSNumber' est un objet (ce qui signifie que'% @ 'est la substitution correcte pour cela). –

+0

souffle, j'ai mal lu la question et a pensé qu'il ajoute flotteurs :( – deanWombourne

1

Eh bien, étant donné le prédicat que vous avez fourni, la réponse est facile:

Soit startNSNumber, endNSNumber ou idString est nul. Si vous voulez comparer quelque chose contre nil dans un NSPredicate, vous devez le remplacer par [NSNull null], et non par nil.

+0

si (startNSNumber) { [NSPredicate predicateWithFormat: @ "(startValue =>% @), startNSNumber] } else { [NSPredicate predicateWithFormat: @ "(startValue =>% @), [NSNull null] } est-ce que ce sera correct?! – Greg

+0

non c'est NSInvalidArgumentException encore:/ – Greg

2

Je crois fermement une de vos variables est nul ou a été autoreleased ...

essayez ceci:

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 cela réussit que le problème est avec vos variables.

Si vous prévoyez soit num1 ou num2 être nil parfois, vous pouvez réécrire le prédicat comme:

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

ouais -.- 'mon problème est quand num1 ou num2 est [NSNumber numberWithFloat: 0.0 ] mais cette valeur est possible et nécessaire, mais NSPredicate ne l'aime pas, jette des exceptions, pourquoi ?! – Greg

+0

ce qui est assez surprenant, êtes-vous sûr que la variable n'est pas "nil"? J'ai exécuté un code de test avec une pause point et '[NSNumber numberWithFloat: 0.0]' génère un objet propre 'NSNumber' ... – Nick

+0

oui, malheureusement, je suis totalement sûr :( – Greg

0

EN NSpredicate utilisation Valeur chaîne comme flotter le key.floatValue Dictionnaire et utiliser facilement.

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

Je trouve ce message utile.