2010-09-29 8 views
8

Hallo ich habe Core Data Datenbank mit numerischen Attributen. Sie sind NSNumbers. Der Standardwert ist 0.0, aber wenn ich versuche, einige NSPredicated holen zu tun, erhalte ich „‚NSInvalidArgumentException‘Grund:‚Ungültige Prädikat: nil RHS‘“, nur weil Attributwert ist 0,0NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone)

Das Prädikat wird mit erstellt:

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

Wie kann ich dieses Problem lösen?

+1

Bitte schreiben Sie, wie Sie das Prädikat erstellen. –

+0

Geben Sie den Code an, mit dem Sie das Prädikat erstellen. – ohhorob

+0

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

Antwort

5

Sie fügen die Floats als Objekte hinzu, nicht als Floats? Versuchen Sie folgendes:

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

Wenn es NSNumber ist, wird dies eindeutig nicht funktionieren. – Eiko

+1

'% f' wird für ein Grundelement' float' verwendet. 'NSNumber' ist ein Objekt (was bedeutet, dass'% @ 'die richtige Ersetzung dafür ist). –

+0

Explosion, falsch verstanden habe ich die Frage und dachte, er schwebt wurde hinzugefügt :( – deanWombourne

1

Nun, da das Prädikat Ihnen zur Verfügung gestellten, die einfache Antwort ist:

Entweder startNSNumber, endNSNumber oder idString null ist. Wenn Sie etwas gegen nil in einem NSPredicate vergleichen möchten, müssen Sie in [NSNull null], nicht nil ersetzen.

+0

so if (startNSNumber) { [NSPredicate predicateWithFormat: @ "(startvalue =>% @), startNSNumber] } else { [NSPredicate predicateWithFormat: @ "(startValue =>% @), [NSNull null] } ?? wird es richtig sein?! – Greg

+0

nein es ist NSInvalidArgumentException wieder:/ – Greg

2

Ich glaube fest eines Ihres Variablen gleich Null ist oder war Autoreleased ...

try this:

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]; 

Wenn dies gelingt, dass das Problem mit Ihren Variablen ist.

Wenn Sie entweder num1 oder num2 erwarten nil manchmal sein, dann könnte man das Prädikat als umschreiben:

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

yeah -.- 'mein Problem ist, wenn num1 oder num2 ist [NSNummer numberWithFloat: 0.0 ] aber dieser Wert ist möglich und notwendig, aber NSPredicate mag es nicht .. throws Exceptions. warum ?! – Greg

+0

das ist ziemlich überraschend, bist du sicher, dass die Variable nicht "nil" ist? Ich habe einen Testcode mit einer Pause ausgeführt point und '[NSNumber numberWithFloat: 0.0]' erzeugt ein richtiges 'NSNumber'-Objekt ... – Nick

+0

ja, leider bin ich mir total sicher :( – Greg

0

IN NSPredicate Wert Verwendung Zeichenfolge als das Wörterbuch key.floatValue schweben und leicht zu benutzen.

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

Ich mache diesen Beitrag nützlich.