2009-04-10 6 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 

있다. 내 응용 프로그램에서

, 나는 (분명히, 오브젝티브 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 > ?"; 

을 시도하고 작동합니다.

관련 문제