2009-04-10 6 views
4

Ich versuche, die SQLite C API in meiner iPhone App zu verwenden. Ich versuche, eine SQLite-Datenbank nach der Anzahl der Datensätze abzufragen, die nach einem bestimmten Datum abgeschlossen wurden. Die Datenbank speichert das abgeschlossene Datum als Text im Format Wie binden Sie literalen Text an eine SQLite-Abfrage?

YYYY-MM-dd
. Beispielsweise könnte der Text
2009-04-10
als abgeschlossenes Datum angezeigt werden.

Wenn ich die Datenbank von der Befehlszeile abfragen, funktioniert meine Abfrage, aber wenn sie von der App ausgeführt wird, tut es nicht. Hier ist, was ich tue:

Von der Kommandozeile, betreibe ich diese Anfrage:

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

Wie Sie sehen können, gibt es einen Datensatz gefunden ist, wie ich erwartet.

In meiner app, führe ich diesen Code (geschrieben in Objective-C, natürlich):

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); 

Wenn ich den Debugger auf diesen Code verwenden, und überprüfen Sie die taskCount Variable wird auf 0 gesetzt, zeigt an, dass keine Datensätze gefunden wurden. (Wenn ich den Code ändern, um Primärschlüssel für gefundene Zeilen zurückzugeben, gibt es immer noch nichts zurück.)

Da es von der Kommandozeile funktioniert, aber nicht in meinem Code, gehe ich davon aus, dass ich etwas falsch mache das Zitieren des Fragezeichens in meinem SQL oder das Binden des literalen Textdatums an die Abfrage. Aber ich habe es viele verschiedene Möglichkeiten ausprobiert, ohne Glück. Hilfe!

Antwort

9

Setzen Sie keine Parameterplatzhalter in Anführungszeichen, auch wenn der Wert eine Zeichenfolge oder ein Datumsliteral ist.

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

Ich denke, dass Sie die zusätzlichen Anführungszeichen um das Fragezeichen nicht benötigen.

Versuchen

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

und sollte es funktionieren.

Verwandte Themen