NSPredicate: как рассматривать строки как числа? - PullRequest
3 голосов
/ 16 января 2012

Я создаю составной NSPredicate, чтобы сделать запрос на выборку, используя базовые данные на sqlite, в приложении iOS.Все уже работает нормально, но я не могу включить последнее условие.Причина довольно проста: мне нужно проверить, находится ли значение, хранящееся в виде строки, в пределах определенных границ с плавающей точкой.Проблема в том, что условия проверяются в алфавитном порядке, а не в соответствии со значением с плавающей запятой.Вот код:

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (%@ >= \"""%@\""")  && (%@ <= \"""%@\""")", propertyName, myMinFloat, propertyName, myMaxFloat];
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded];  
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate];

Кто-нибудь знает, как создать объект NSPredicate, способный проверять строковые значения как числа, которые будут использоваться в запросе coredata?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 07 июня 2013

Поскольку NSPredicates позволяют вам использовать все, что соответствует подходу Key-Value Coding, вы можете вызывать такие методы NSStrings, как: intValue или floatValue

NSString * conditionToBeAdded = [NSString stringWithFormat:@" && (propertyName.floatValue >= %f )  && (propertyName.floatValue <= %f)", myMinFloat, myMaxFloat];
stringForPredicate = [stringForPredicate stringByAppendingString:conditionToBeAdded];  
NSPredicate * myPredicate = [NSPredicate predicateWithFormat:stringForPredicate];

Надеюсь, это поможет.

0 голосов
/ 16 января 2012

Вы захотите изменить эту строку на число и исправить это правильно. Поиск строки SLOW , и его следует избегать. Помещение чисел в строки - это большой удар по производительности без выигрыша.

Что касается вашего фактического предиката, вы можете сделать <или> сравнение строк. Я подозреваю, что все те кавычки, которые у вас есть в предикате, отбрасывают вещи. Кавычки не нужны в предикатах, если вы не устанавливаете константу, которой в данном случае вы не являетесь. Удалите их и попробуйте снова.

...