Использование одинарных кавычек при построении строки в Какао - PullRequest
1 голос
/ 05 марта 2009

Я строю строку в Какао для использования в качестве оператора SQL, который будет передан в обертки FMDB для sqlite; тем не менее, база данных завершается с ошибкой BAD_ACCESS. У меня есть следующий код:

prefix = @ "SELECT * FROM Table, WHERE Field1 LIKE '%";

middle = @ "% 'ИЛИ Field2 LIKE'%";

суффикс = @ "% 'ORDERY BY";

orderby = @ "% 'ORDER BY Имена полей";

sqlStatement = [NSString stringWithFormat: @ "% @% @% @% @% @% @", префикс, searchString, middle, searchString, суффикс, orderby];

Во время выполнения sqlStatement содержит что-то вроде следующего:

ВЫБРАТЬ * ИЗ таблицы ГДЕ Поле1 LIKE \ '% A% \' ИЛИ ​​Field2 LIKE \ '% A% \' ORDER BY Имена полей

По какой-то причине в строку добавляется символ \, который вызывает бомбардировку базы данных.

Есть идеи, как я могу предотвратить появление \ в моей строке?

UPDATE: Когда я вывожу свою переменную через NSLog, я получаю следующее: ВЫБРАТЬ * ИЗ таблицы ГДЕ Поле1 LIKE 'OX1.87A8013DBD18F-1027' ИЛИ ​​Field2 LIKE 'OX1.87A8013DBD18F-1027'ORDER BY Имя поля.

Кажется, проблема в использовании% A в строке. Даже если я жестко закодирую переменную sqlStatement для включения «% A%»,% A, похоже, преобразуется в адрес памяти или что-то в этом роде. Если я сделаю «% ABAP%», я получу вывод типа «OX1.87A8013DBD18F-1027BAP». Обратите внимание, я теряю знак%.

Ответы [ 4 ]

4 голосов
/ 05 марта 2009

Я собираюсь предположить, что вы используете sqlite, и в этом случае вы хотите сделать это немного по-другому. Сначала создайте свой запрос следующим образом:

SELECT * FROM Table WHERE Field1 LIKE ?001 OR Field2 LIKE ?002 ORDER BY Fieldnames

Синтаксис? 000 для параметров.

Затем вы можете использовать sqlite3_bind_text для привязки ваших параметров:

sqlite3_bind_text(statement, 1, [@"%bar%" UTF8String], -1, SQLITE_STATIC);
sqlite3_bind_text(statement, 2, [@"%foo%" UTF8String], -1, SQLITE_STATIC); 

Надеюсь, это должно указать вам правильное направление.

2 голосов
/ 05 марта 2009

Относительно вашего «обновления»:

Похоже, что "% A" используется как спецификатор формата, а именно:

% A: 64-разрядное число с плавающей запятой (double), напечатано в научной записи с ведущий 0X и одна шестнадцатеричная цифра перед десятичной точкой, используя прописные буквы P для введения показателя степени

См. Руководство по программированию строки для какао .

Итак, вы используете строку sqlStatement позже как строку управления форматом, что плохо. Если вам нужно передать sqlStatement методу / функции, которая интерпретирует строку как спецификатор формата, вы должны передать ее как do_query(@"%@", sqlStatement)

0 голосов
/ 05 марта 2009

Что вы имеете в виду под "во время выполнения"? Вы имеете в виду в отладчике Xcode?

Кажется, вы нацелены на эту проблему .

Одиночные кавычки с обратной косой чертой кажется, появляются только внутри Переменная окна отладчика Xcode Сводная колонка. Изучение стоимости «sql» вручную в GDB показывает правильный формат:

(gdb) po sql select * from t_state где код_состояния = 'XX'

и NSLogging строка также оставляет обратная косая черта Итак, я бы сказал, что те одиночные кавычки экранируются для некоторых причина только в процессе Xcode форматирование объекта для отображения в Переменное представление.

0 голосов
/ 05 марта 2009

Строка, кажется, построена правильно. Если я запускаю код:

int main(int argc, char *argv[])
{
    NSAutoreleasePool* pool = [NSAutoreleasePool new];

    NSString* prefix = @"SELECT * FROM Table WHERE Field1 LIKE '%";

    NSString* middle = @"%' OR Field2 LIKE '%";

    NSString* suffix = @"%' ORDERY BY ";

    NSString* orderby = @"%' ORDER BY Fieldnames";

    NSString* sqlStatement = [NSString stringWithFormat:@"%@%@%@%@%@%@", prefix, @"blah", middle, @"blah", suffix, orderby];

    NSLog(@"sqlStatement: %@", sqlStatement);

    [pool drain];

    return 0;
}

В консоли я получаю следующий результат:

2009-03-05 08:04:29.734 Untitled[79999:813] sqlStatement: SELECT * FROM Table WHERE Field1 LIKE '%blah%' OR Field2 LIKE '%blah%' ORDERY BY %' ORDER BY Fieldnames
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...