Когда использовать SQLITE_TRANSIENT против SQLITE_STATIC? - PullRequest
16 голосов
/ 04 августа 2009

Я хотел бы создать / обновить текстовые столбцы в sqlite3. Когда я получаю строки после создания / обновления, текст «?». Однако целочисленные значения правильно сохраняются.

Мои текстовые заявления выглядят так:

const char *sql = "INSERT INTO todo(title, description, priority, status, created, expires, posx, posy, updated)"
                  " VALUES('?', '?', '?', '?', '?', '?', '?', '?', '?');";
if (sqlite3_prepare_v2(database, sql, -1, &insert_statment, NULL) != SQLITE_OK)
    ...
sqlite3_bind_text(update_statment, 5, [[dt stringFromDate:self.updated] UTF8String], -1, SQLITE_TRANSIENT);

Я пробовал SQLITE_TRANSIENT, а также SQLITE_STATIC. Оба случая, похоже, дают одинаковые результаты ('?'). Я также проверил, что текстовые значения действительны, когда они передаются в соответствующие операторы SQL здесь.

Есть идеи?

1 Ответ

42 голосов
/ 04 августа 2009

Удалить символы вокруг? в вашей строке sql.

SQLITE_TRANSIENT говорит SQLite скопировать вашу строку. Используйте это, когда ваша строка (буфер) собирается исчезнуть до выполнения запроса.

SQLITE_STATIC сообщает SQLite, что вы обещаете, что указатель, который вы передаете в строку, будет действителен до тех пор, пока не будет выполнен запрос. Используйте это, когда ваш буфер является статическим или, по крайней мере, имеет динамическую область, превышающую область привязки.

...