Проблемы записи строк в базе данных sqlite - PullRequest
1 голос
/ 03 сентября 2011

Я борюсь с этой базой данных, и у меня странная проблема ... Если я пытаюсь вставить в качестве имени элемента одно слово, все работает нормально, но если слов 2 или больше, это не получается!

Это часть кода:

NSString *insertStatementsNS = 
    [NSString stringWithFormat: @"insert into \"shoppinglist\" 
    (item, price, groupid, dateadded) values (\"%@\", %@, %d, DATETIME('NOW'))",
    name_field, price_field, [groupPicker selectedRowInComponent:0]];

Полагаю, проблема в -> \ "% @ \" <- но я не знаю, как это исправить. </p>

Может ли кто-нибудь мне помочь?

#

Я выполнил действия, описанные выше, но что-то пошло не так, теперь у меня появилась новая ошибка:

NSString *itemValue = [[NSString alloc] initWithUTF8String: (char*) sqlite3_column_text(dbps, 1)];

и программа останавливается при запуске ... Она больше не может читать из БД ... что случилось?

#

Хорошо исправлено благодаря другу ... мы просто сбросили память симулятора. И мы также решаем проблему ... работая по-другому.

Вместо использования переменной "name_field" я использовал "itemNameField.text" (непосредственно к источнику ...) и по какой-то причине это работает!

Ответы [ 2 ]

2 голосов
/ 03 сентября 2011

Следует избегать прямого присвоения значений столбцам в операторах sql.Вместо этого вы должны использовать prepared statement и bind значения для него.

sqlite3_stmt  *stmt = nil;
NSString *sqlStr = @"insert into shoppinglist(item, price, groupid, dateadded) 
                   values (?, ?, ?, DATETIME('NOW'))";
char *sql = (char *) [sqlStr UTF8String];

if (sqlite3_prepare_v2(DB, sql, -1, &stmt, NULL) != SQLITE_OK) {

    NSAssert1(0, @"Error Preparing Statement: %s", sqlite3_errmsg(DB));
}

sqlite3_bind_text(stmt, 1, name_field, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, price_field, -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 3, [groupPicker selectedRowInComponent:0]);
...

Всегда безопасно использовать подготовленные операторы, если вы напрямую подставляете строковые значения и если строковые значения содержат специальные символы, такие как double-кавычки (" или "), то при выполнении sql будут нежелательные результаты.Но если вы используете подготовленные операторы, вам не нужно беспокоиться о фактическом содержании значений, которые вы связываете.Эти значения будут безопасно добавлены в БД.

1 голос
/ 03 сентября 2011

Просто используйте "% @"

NSString *insertStatementsNS = 
[NSString stringWithFormat: @"insert into \"shoppinglist\" 
(item, price, groupid, dateadded) values ('%@', %@, %d, DATETIME('NOW'))",
name_field, price_field, [groupPicker selectedRowInComponent:0]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...