2012-10-10 16 views
0

選擇單行時while循環進入內部我有一個問題sqlite,當我從選擇單行,然後檢查sqlite3_step(statement) == SQLITE_ROW兩個值是不同的,裏面while statement沒有得到。不是從源碼

這是代碼:

if (sqlite3_prepare_v2(db, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
{ 
    //NSLog(@"working777.............%d",sqlite3_step(statement)); 

    while (sqlite3_step(statement) == SQLITE_ROW) 
    { 
     NSLog(@"working888.............%d",SQLITE_ROW); 
     NSString *addressField = [[NSString alloc] initWithUTF8String: (const char *) sqlite3_column_text(statement, 0)]; 


     NSString *phoneField = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 1)]; 


     NSLog(@"............statement...........addressField %@, phoneField %@",addressField,phoneField); 
    } 

    sqlite3_finalize(statement); 
} 
    sqlite3_close(db); 

} 
+0

您需要發佈查詢。只有當查詢有一個或多個結果時纔會輸入while循環。如果查詢不返回任何行,則不會輸入while循環。 – rmaddy

+0

NSString * querySQL = [NSString stringWithFormat:@「SELECT * FROM Major_Events WHERE temple_id = \」%@ \「」,temp_id];這是我使用的查詢,表中有一行對應於temp_id – user1376474

+0

字符串值應該是單引號,而不是雙引號。表格文本中的temple_id列還是數字?如果是文字,請使用引號。創建這樣的SQL語句也是一種糟糕的形式。你真的應該綁定變量而不是使用字符串格式。 – rmaddy

回答

0

正確的方式來創建這樣的查詢會是這樣的:

NSString *querySQL = @"SELECT * FROM Major_Events WHERE temple_id = ?"; 

然後準備語句。我假設query_stmt是querySQL的char *值。

一旦語句準備好了,您就需要綁定該值。

sqlite3_bind_int(statement, 1, temp_id); // bind is 1-based 

當然temp_id需要是一個int值而不是一個字符串。對於不同的數據類型,有各種sqlite3_bind_xxx語句。使用適當的一個。

一旦綁定了所有查詢參數,就可以使用sqlite3_step執行查詢。

字符串格式的這種方法的好處是字符串得到正確的轉義併爲你引用引號。它很難搞砸,這使得您的查詢更安全,防範SQL注入攻擊。

0

對於許多記錄: -

if (sqlite3_open([[self getDBPath] UTF8String], &database) == SQLITE_OK) { 
     const char *sql = "select * from Place"; 
     sqlite3_stmt *selectstmt; 
     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 

      while(sqlite3_step(selectstmt) == SQLITE_ROW) { 

      } 
      sqlite3_finalize(selectstmt); 
      sqlite3_close(database); 
     } 
    } 
    else 
    { 
     sqlite3_close(database); 
    } 

If you want a single record then change while to if 

if(sqlite3_step(selectstmt) == SQLITE_ROW) { 

其餘的一切都將是相同的

我希望它能幫助,如果是沒有得到執行while循環那麼就意味着有一些問題與您query.You還需要檢查。