Как связать буквенный текст с запросом SQLite? - PullRequest
4 голосов
/ 10 апреля 2009

Я пытаюсь использовать SQLite C API в своем приложении для iPhone. Я пытаюсь запросить базу данных SQLite для количества записей, которые были завершены после определенной даты. База данных сохраняет завершенную дату в виде текста в формате

YYYY-MM-dd
. Например, текст
2009-04-10
может отображаться как завершенная дата.

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

Из командной строки я запускаю этот запрос:

sqlite> SELECT COUNT(*) FROM tasks WHERE completed > '2009-04-09'
...> go
1

Как видите, найдена одна запись, как я и ожидал.

В моем приложении я выполняю этот код (очевидно, написанный на Objective-C):

static sqlite3_stmt *count_tasks_statement = nil;
if(count_tasks_statement == nil) {
    const char *sql = "SELECT COUNT(*) FROM tasks WHERE completed > '?'";

    if (sqlite3_prepare_v2(database, sql, -1, &count_tasks_statement, NULL) != SQLITE_OK) {
        NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database));
    }
}

NSString *today = @"2009-04-09";
sqlite3_bind_text(count_tasks_statement, 1, [today UTF8String], -1, SQLITE_TRANSIENT);

// Get the row count from the query
NSInteger taskCount = 0;
if(sqlite3_step(count_tasks_statement) == SQLITE_ROW) {

    // The second parameter indicates the column index into the result set.
    taskCount = sqlite3_column_int(count_tasks_statement, 0);
}

// Reset the statement for future reuse.
sqlite3_reset(count_tasks_statement);

Когда я использую отладчик для этого кода и проверяю переменную taskCount, она устанавливается в 0, указывая, что записи не были найдены. (Если я изменю код для возврата первичных ключей для найденных строк, он все равно ничего не вернет.)

Так как это работает из командной строки, но не в моем коде, я предполагаю, что я делаю что-то не так с цитированием вопросительного знака в моем SQL или с привязкой буквенной даты текста запрос. Но я пробовал много разных способов, но не повезло. Помогите!

Ответы [ 2 ]

9 голосов
/ 10 апреля 2009

Не помещайте заполнители параметров в кавычки, даже если значение представляет собой строку или литерал даты.

const char *sql = "SELECT COUNT(*) FROM tasks WHERE completed > ?";
2 голосов
/ 10 апреля 2009

Я думаю, что вам не нужны лишние кавычки вокруг знака вопроса.

Попробуйте

const char *sql = "SELECT COUNT(*) FROM tasks WHERE completed > ?";

и должно работать.

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