Я пытаюсь использовать 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 или с привязкой буквенной даты текста запрос. Но я пробовал много разных способов, но не повезло. Помогите!