ObjectiveC sqlite3 проблема - PullRequest
       2

ObjectiveC sqlite3 проблема

8 голосов
/ 30 июня 2011

Я обнаружил, что у меня возникла проблема при обновлении / вставке в мою таблицу в приложении для iPhone, поскольку у меня есть столбец TEXT, а когда этот текст содержит символ ', все портится. Каков наилучший способ справиться с этим?

Должен ли я проверить, прежде чем использовать строку с апострофом? Есть ли быстрый способ добавить форматирование, которое будет добавлять escape-символ перед каждым апострофом?

Имеет ли этот вопрос смысл? лол.

Ответы [ 4 ]

12 голосов
/ 30 июня 2011

sqlite требует, чтобы «символ убирался двумя».

Посмотрите на это из официального FAQ по sqlite :

(14) How do I use a string literal that contains an embedded single-quote (') character?

The SQL standard specifies that single-quotes in strings are escaped by putting two single quotes in a row. SQL works like the Pascal programming language in the regard. SQLite follows this standard. Example:

    INSERT INTO xyz VALUES('5 O''clock');
5 голосов
/ 15 октября 2012

эй, забудь все это. Если вы хотите, чтобы ваша БД содержала '. Просто замените строку на% 27, а при ее извлечении конвертируйте обратно Вы получите то, что хотите. Проверьте ниже:

// while Inserting into db
    str = [str stringByReplacingOccurrencesOfString:@"'" withString:@"%27"];

// while fetching it back
        text = [text stringByReplacingOccurrencesOfString:@"%27" withString:@"'"];

Наслаждайтесь программированием :):)

5 голосов
/ 30 июня 2011

Есть три способа решить эту проблему:

  1. Выполните форматирование самостоятельно. Не делайте этого. (Ну, нет, если только эта строка не является частью вашего кода, а не вводится пользователем. В этом случае этот подход подходит.)
  2. Используйте sqlite3_mprintf("%Q") длясделать SQLite сделать это.(%q делает замену кавычек; %Q делает замену кавычек и вставляет NULL для нулевого указателя.)
  3. Используйте привязки в вашем утверждении, которое вы заполняете sqlite3_bind_text.Это лучший способ сделать это, так как он не требует перекомпиляции оператора для каждой строки и не открывает вам SQL-инъекцию .

Использование привязки будетвыглядеть следующим образом:

sqlite3_prepare(db, "INSERT INTO Table(Column) VALUES(?);", -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, [str cStringUsingEncoding:NSUTF8StringEncoding],
                  -1, SQLITE_TRANSIENT);
// stepping, etc

(Не забудьте выполнить проверку ошибок.)

3 голосов
/ 30 июня 2011

В SQLite есть функция, которая может при необходимости экранировать символы. Взгляни на: sqlite3_mprintf

http://www.sqlite.org/c3ref/mprintf.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...