NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone) - PullRequest
       37

NSPredicate, NsNumber numberWithFloat: 0.0 (iPhone)

8 голосов
/ 29 сентября 2010

привет, у меня есть база данных Core Data с числовыми атрибутами.это номера NSN.Значение по умолчанию - 0.0, но когда я пытаюсь выполнить некоторую выборку с использованием NSP, я получаю «NSInvalidArgumentException», причина: «Недопустимый предикат: nil RHS» только потому, что значение атрибута равно 0.0

Предикат создается с помощью:

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

как я могу решить эту проблему?

Ответы [ 4 ]

5 голосов
/ 29 сентября 2010

Вы добавляете поплавки как объекты, а не как поплавки? Попробуйте это:

[NSPredicate predicateWithFormat:@"(startValue => %f) AND (endValue <= %f) AND (someId == %@)",startNSNumber,endNSNumber, idString];
2 голосов
/ 29 сентября 2010

Я твердо верю, что одна из ваших переменных - ноль или была автоматически освобождена ...

попробуйте это:

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

Если это удастся, проблема с вашими переменными.

Если вы ожидаете, что num1 или num2 будут иногда nil, то вы можете переписать предикат как:

[NSPredicate predicateWithFormat:@"(startValue => %@) AND (endValue <= %@) AND (someId == %@)", num1 ? num1 : [NSNumber numberWithFloat:0.0], num2 ? num2 : [NSNumber numberWithFloat:0.0], idString];
1 голос
/ 29 сентября 2010

Ну, с учетом предиката, который вы предоставили, простой ответ:

Либо startNSNumber, endNSNumber, либо idString равно нулю. Если вы хотите сравнить что-то с nil в NSPredicate, вам нужно заменить на [NSNull null], а не nil.

0 голосов
/ 05 октября 2013

IN NSpredicate использовать строковое значение как float словаря key.floatValue и легко использовать.

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

Я считаю этот пост полезным.

...