2009-04-10 4 views
4

iPhoneアプリでSQLite C APIを使用しようとしています。特定の日付の後に完了したレコードの数をSQLiteデータベースに照会しようとしています。データベースは完成した日付をリテラルテキストをSQLiteクエリにバインドする方法は?

YYYY-MM-dd
形式のテキストとして保存します。たとえば、テキスト
2009-04-10
が完成日として表示されることがあります。

コマンドラインからデータベースにクエリを実行すると、クエリは機能しますが、アプリケーションから実行するとクエリは機能しません。ここで私がやっているものです:

をコマンドラインから、私はこのクエリを実行します。

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

あなたが見ることができるように、私は期待してた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での疑問符の引用、またはリテラルテキストの日付のクエリへのバインディングを使用します。しかし、私はそれが運がないと、さまざまな方法を試してみました。助けて!

答えて

9

値が文字列または日付リテラルであっても、パラメータープレースホルダーを引用符で囲まないでください。

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

私はあなたが疑問符の周りに余分な引用符を必要としないと思います。

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

を試してみて、それが動作するはずです。

関連する問題