2010-07-05 51 views
0

試圖返回iPhone上的SQLite中是否存在記錄,除非我一直收到'未知錯誤'。當選擇總記錄數時,iPhone上SQLite的'未知錯誤'

selectStmt是static sqlite3_stmt *selectStmt = nil;這裏使用的if(selectStmt) sqlite3_finalize(selectStmt);它只在應用程序終止時才被執行。這個功能適用於刪除語句和插入語句,所以我猜測下面的邏輯是有問題的?

- (BOOL) doesBookExist { 

    if(selectStmt == nil) { 
     const char *sql = "select count(*) from books where isbn = ?"; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating select statement. '%s'", sqlite3_errmsg(database)); 
    } 

    //When binding parameters, index starts from 1 and not zero. 
    int count = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT); 

    if (SQLITE_DONE != sqlite3_step(selectStmt)) 
     NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database)); 

    sqlite3_reset(selectStmt); 

    return (count > 0); 
} 

回答

2

sqlite3_bind_text返回成功/錯誤代碼,沒有任何查詢的結果。並且步驟應該返回SQLITE_ROW,因爲您有一行結果數據(不管計數是否爲0或更多)。似乎有錯誤,因爲當正確的值爲SQLITE_ROW時,您期待SQLITE_DONE。然後,要執行步驟,您需要使用sqlite3_column_int。所以像這樣:

int bind_res = sqlite3_bind_text(selectStmt, 1, [isbn UTF8String], -1, SQLITE_TRANSIENT); 

if (SQLITE_OK != bind_res) 
{ 
    // log error, return... 
} 

// One row of result data, so step should return SQLITE_ROW 
if (SQLITE_ROW != sqlite3_step(selectStmt)) 
{ 
    NSAssert1(0, @"Error while selecting. '%s'", sqlite3_errmsg(database)); 
    // log error, return 
} 

int count = sqlite3_column_int(selectStmt, 0); 
+0

這是非常有意義的,它的工作原理是如何我希望它的工作。謝謝。 – fuzz 2010-07-05 23:28:42

+0

'isbn'是什麼? – Sridhar 2014-03-19 05:16:59

+0

@Sridhar,http://en.wikipedia.org/wiki/ISBN。但是它也是這個代碼中的一個列名和一個變量。 – 2014-03-19 23:05:38