2014-03-07 542 views
-1

我調試了代碼,但不知道爲什麼while語句沒有執行。把NSlog後,我才知道它的結果不匹配。 101和SQLITE_ROW等於100.while(sqlite3_step(statement)== SQLITE_ROW)循環不起作用

但查詢有結果。如果我從表名獲取Select *,則返回結果並執行語句。如果我取結果

sql_stmt = [NSString stringWithFormat:@"SELECT * FROM DeviceType WHERE upper(TypeName) = upper('%@')", deviceType]; 

雖然聲明從不執行,所以請幫助。不知道問題在哪裏。

下面是代碼:

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); 

NSString* documentsDirectory = [paths objectAtIndex:0]; 

NSString* path = [documentsDirectory stringByAppendingPathComponent:@"ClientDB.sqlite"]; 

NSString* sql_stmt = [self searchStringForLocalData]; 

BOOL found = NO; 

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
{ 
    const char* sql1 = [sql_stmt UTF8String]; 

    sqlite3_stmt *statement; 

    NSNumber *typeCount; 

    typeCount = 0; 

    if (sqlite3_prepare_v2(database, sql1, -1, &statement, NULL) == SQLITE_OK) 
    { 

     NSLog(@" %d, %d ",sqlite3_step(statement),SQLITE_ROW); 

     while (sqlite3_step(statement) == SQLITE_ROW) { 

      // The second parameter indicates the column index into the result set. 
      int primaryKey1 = sqlite3_column_int(statement, 0); 


    NSNumber *typeId = [[NSNumber alloc] initWithInt:primaryKey1]; 

NSString *typeName =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 

      NSString* sql_stmt1 = [NSString stringWithFormat:@"SELECT COUNT(*) FROM Devices WHERE DeviceTypeId =%d",primaryKey1]; 


      const char *sql1 = [sql_stmt1 UTF8String]; 

      sqlite3_stmt *statement; 

      NSNumber *typeCount; 

      typeCount = 0; 
+0

那麼,sqlite3_step返回的代碼是什麼,sqlite3_errmsg報告什麼? –

+0

那麼,sqlite3_step返回什麼代碼,sqlite3_errmsg報告什麼? –

回答

-1

嘗試使用下面的語法

在評論已經提到
while(sqlite3_step(stmt)!=SQLITE_DONE) 
{ 
    //do ur processing 
    for(i=0;i<NO_OF_COLS;i++) 
    { 
    char * tmp1=sqlite3_column_text(stmt,i); 
     if(tmp1!=NULL) 
     { 
      //use the value 
     } 
     else 
     { 
      //use a default 
     } 
    } 
} 
+0

我已經試過這種方式了。它允許在循環內部輸入。但是當代碼嘗試獲取第一行的結果時,它會使應用程序崩潰並顯示行內沒有任何內容 由於未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:'*** + [ NSString stringWithUTF8String:]:NULL cString' ***第一次拋出調用堆棧: –

+0

如果你的表中的列爲空sqlite3 api返回一個空指針,所以嘗試添加一個檢查說sqlite3_column_text(stmt,i)!= null – user3182350

+0

我更改此語句sql_stmt = [NSString stringWithFormat:@「SELECT * FROM DeviceType WHERE upper(TypeName)= upper('%@')」,deviceType]; 爲了 \t sql_stmt = [NSString的stringWithFormat:@ 「SELECT FROM設備類型COUNT(*)WHERE上(類型名)=上( '%@')」,設備類型] 現在其打印的NSLog(100,100) 但我現在想知道它的匹配。但它仍然沒有進入循環,任何想法 –

0

由於,代碼調用sqlite3_step曾經爲NSLog,然後第二次在while循環的條件下。 如果您的查詢只返回一條記錄,則第一個sqlite3_step調用將跳到該記錄,第二個調用將會(正確)報告沒有其他結果可用。

只要刪除那NSLog電話。

或者,撥打sqlite3_step只有一次,並使用相同的返回值的記錄和循環兩種:

int rc; 
... 
while (1) { 
    rc = sqlite3_step(statement); 
    NSLog(@" %d, %d ", rc, SQLITE_ROW); 
    if (rc != SQLITE_ROW) 
     break; 
    ... 
} 
if (rc != SQLITE_DONE) 
    NSLog(@"error: %s", sqlite3_errmsg(database)); 
+0

-1,因爲你不記錄sqlite3_errmsg的錯誤。 –

0

這表明你的表是完全空。你可能想檢查你的插入是否正常工作。如果您使用sqlite3_prepare_v2來準備一些?標記聲明,請記住執行您的查詢。只要是這樣的:

if(sqlite3_step(stmt) == SQLITE_DONE) NSLog(@"INSERTED"); 
else NSLog(@"NO INSERTED"); 

注意:只有當您的查詢是錯了,它會顯示錯誤,但不能被執行,或者不是你事先準備好的聲明。