iPhone SQLite команды с апострофами - PullRequest
1 голос
/ 26 августа 2009

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

Таблица SQLite


Row - Column1 - Столбец2 ---------

  1. Данные испытаний - 001
  2. Данные пользователя - 002

Код Objective-C


//Create the sql statement
sqlite3_stmt *sqlStatement;

//Create the name of the category that will be passed in
NSString *categoryName = @"User's Data";

//Create the rest of the SQL query
NSString *sqlQuery = "SELECT * FROM theTableName WHERE Column1 = ?";

//If there are no errors in the SQL query
if (sqlite3_prepare_v2(theDatabase, sqlQuery, -1, &sqlStatement, nil) == SQLITE_OK)
{
    //Bind the category name to the sql statement
    sqlite3_bind_text(sqlStatement, 1, [categoryName UTF8String], -1, SQLITE_TRANSIENT);

    //While there are rows being returned
    while (sqlite3_step(sqlStatement) == SQLITE_ROW)
    {
        //Retrieve row data
    }
}
else
{
    //Save error message to the application log and terminate the app
    NSAssert1(0,@"Error: Failed to prepare the SQL statement with message '%s'.", sqlite3_errmsg(database));
}
//Reset the sql statement
sqlite3_reset(sqlStatement);

Я наполовину новичок в цели C, поэтому моя первая мысль при написании этого кода заключалась в том, чтобы очистить вводимые пользователем данные. Но после некоторого исследования я прочитал, что вызовы sqlite3_bind обеспечивают необходимую санитарную обработку для вас. Но всякий раз, когда код выполняется, цикл while пропускается сразу, потому что строки не возвращаются. Он должен вернуть вторую строку из таблицы базы данных. Если я копирую / вставляю точный тот же запрос SQL в управляющую программу SQL (я использую SQLite Manager ) (и, конечно, с необходимой обработкой запросов), он возвращает правильные данные.

Я потратил много времени, пытаясь отлаживать это сам, и еще больше времени, пытаясь найти в Интернете аналогичную проблему, которая объясняется и решается, но безрезультатно. На данный момент я просто отключил способность пользователя вводить апостроф на виртуальной клавиатуре iPhone. Но эту функцию я бы хотел включить в свой готовый продукт. Может кто-нибудь здесь предложить мне какие-нибудь полезные советы? Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

7 голосов
/ 26 августа 2009

Для sqlite ваш запрос будет (как вы видите, он даже выделен неправильно):

SELECT * FROM theTableName WHERE Column1 = User's data

И он будет ждать символа закрытия

Вы должны повторить символ ', например, следующим образом:

NSString *sqlQuery = [NSString stringWithFormat:@"SELECT * FROM tableName WHERE Column1=\"%@\"", categoryName];

В этом случае запрос будет

select * from theTableName where column1="User's data"

это вполне допустимый запрос.

В этом случае вам больше не нужно связывать, и окончательный код будет выглядеть так:

if (sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &sqlStatement, nil) == SQLITE_OK)
{
    //While there are rows being returned
    while (sqlite3_step(sqlStatement) == SQLITE_ROW)
    {
       //Retrieve row data
    }
}
else
{
   //Save error message to the application log and terminate the app
    NSAssert1(0,@"Error: Failed to prepare the SQL statement with message '%s'.", sqlite3_errmsg(database));
}
2 голосов
/ 06 января 2010

Официальный персонаж - ''

продезинфицировать с:

NSString *stringToSanitize = @"This is the value with ' character";

NSString *sanitized = [stringToSanitize stringByReplacingOccurrencesOfString:@"'"
                                     withString:@"''"];

Тогда вы можете использовать его в своих запросах

...