Как передать значение из Какао в запрос SQLite - PullRequest
0 голосов
/ 07 декабря 2009

Прежде всего, пожалуйста, позвольте мне сказать, что я совершенно новичок в цели c разработки. Я пишу небольшое приложение для личного пользования для iphone, но у меня есть некоторые проблемы при выполнении следующего кода:

NSString *sql = [[NSString alloc] initWithFormat:@"select color_r, color_g, color_b from Calendar where ROWID = %@", [calendarsID objectForKey:[arrayColors objectAtIndex:row]]];

sqlite3_stmt *selectstmt;

if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK)

Компилятор говорит мне, что я передаю аргумент 2 sqlite3_prepare_v2 из несовместимого типа указателя. Во всяком случае, программа компилируется и запускается, но когда ей нужно выполнить код, который я только что показал вам, она выдает ошибку. Это говорит о том, что в запросе есть синтаксическая ошибка, а синтаксическая ошибка только в последней части запроса. Вместо того, чтобы:

выберите color_, color_g, color_b из календаря, где ROWID = 63 (например)

Я получаю странные символы вместо последнего номера (63). Я думаю, что это проблема, связанная с преобразованием строк. Может ли кто-нибудь помочь мне?

Большое спасибо за ваше внимание. Alessio

Ответы [ 4 ]

6 голосов
/ 07 декабря 2009

Проблема в том, что NSString не то, что sqlite3_prepare_v2() ожидает для своего второго аргумента. Он хочет const char*. C здесь немного слаб, и он позволяет вам неявно приводить NSString* к const char*, что НЕПРАВИЛЬНО - компилятор выдает вам предупреждение, которое вы не должны игнорировать.

Вам необходимо преобразовать NSString в const char*. Самый простой способ сделать это - использовать сообщение -UTF8String, чтобы преобразовать его в UTF-8:

//                              V---- HERE ----V
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &selectstmt, NULL) == SQLITE_OK)

В качестве альтернативы, в маловероятном случае, когда вы хотите использовать другую кодировку, вы можете использовать сообщение -cStringUsingEncoding: для преобразования строки в строку C с использованием определенной кодировки символов.

1 голос
/ 07 декабря 2009

Почему вы не используете один из API привязки значений SQLite ? Заявление будет выглядеть примерно так:

SELECT color_r, color_g, color_b FROM Calendar WHERE ROWID = ?;

И вы передадите аргумент непосредственно в SQLite, чтобы он был безопасно вставлен в запрос. Это защитит вас от атак SQL-инъекций. (Пример, который вы показываете , может быть безопасным, в зависимости от того, откуда в конечном итоге эти значения, но использование sprintf или stringWithFormat: для построения SQL-запросов - очень и очень плохая привычка в. Не облажайся Столики Бобби .)

Что касается причины проблемы, SQLite не принимает типы какао, такие как NSString *. Когда вы переключитесь на использование SQLite для форматирования запроса, вы сможете узнать из его документации, какой тип вы должны использовать. Затем вы можете задать еще один вопрос о том, как выполнить это преобразование.

1 голос
/ 07 декабря 2009

Я думаю, что ваша главная проблема в том, что вы используете sqlite C api напрямую вместо оболочки .

0 голосов
/ 07 декабря 2009

Alessio,

Было бы проще ответить на этот вопрос немного подробнее. Например, какие объекты находятся в arrayColors?

Если объекты в arrayColors не являются NSStrings, то вы хотите вызвать метод (например, описание) для создания представления NSString.

Aaron

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