2011-05-17 82 views
0

嗨,我寫一個iPhone應用程序,需要sqlite和一個更新查詢。所以,簡單地說,爲什麼這個工程:Sqlite更新問題

NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@", 
    @"UPDATE ZTABELLA SET ZTYPE =",@"1", 
    @" WHERE ZNAME='",@"stringaoggetto",@"';"]; 

sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL); 

,爲什麼這不工作:

NSString *query=[NSString stringWithFormat:@"%@%@%@%@%@", 
    @"UPDATE ZTABELLA SET ZTYPE =",@"1", 
    @" WHERE ZNAME='",oggetto,@"';"]; 

sqlite3_exec(database2, [query UTF8String], NULL, NULL, NULL); 

這兩個例子的區別只在第一@"stringaoggetto"和第二oggetto。在第一個我直接插入一個字符串的值,在第二個例子中oggetto是一個nsstring對象,裏面有正確的值(我打印了一個nslog)。爲什麼這個區別?

的日誌查詢是針對各實施例相同的:

NSLog(@" %@",query); 
//this log print: UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME='stringaoggetto'; 

的日誌NSString的對象「oggetto」是:

NSLog(@"%@",oggetto); 
//this log print stringaoggetto 

我也曾嘗試另一個代碼來檢查錯誤,但結果是一樣的:

if (sqlite3_open([dbPath2 UTF8String], &database2) == SQLITE_OK) { 


     const char *update = "UPDATE ZTABELLA SET ZTYPE =1 WHERE ZNAME=?"; 

     sqlite3_stmt *updatestmt; 
if(sqlite3_prepare_v2(database2, update, -1, &updatestmt, NULL) == SQLITE_OK) { 

sqlite3_bind_text(updatestmt, 1, [oggetto UTF8String] , -1, SQLITE_TRANSIENT); 


if(SQLITE_DONE != sqlite3_step(updatestmt)){ 

    NSAssert1(0, @"Error while updating. '%s'", sqlite3_errmsg(database2)); 

       } 
sqlite3_reset(updatestmt);     

      } 
      else { 
       NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database2)); 

      } 
      } 

作爲第一個直接查詢(使用sqlite3_exc)在這種情況下t他sqlite3_bind_text不工作後where子句。使用相同的查詢,如果我嘗試用於測試目的設置ZNAME的列ZTYPE(但其他任何列不能設置「Where」)它的工作原理。爲什麼?

這是的NSString oggetto的初始化,是選擇查詢的結果:

NSMutableString *oggetto; 
oggetto=[NSString stringWithCString:(char *)sqlite3_column_text(selectstmt, 0)]; 

此字符串保留正確的值(該值是「stringaoggetto」),我試圖用NSLog的。

+0

oggetto有什麼價值?您還應該綁定值而不是直接包含值。 – Anna 2011-05-17 16:34:10

+0

或者是因爲您的oggetto與@「stringaoggetto」的值不同或者您的tableNames在兩個查詢中都不相同。 – SayeedHussain 2011-05-17 18:35:57

+0

對不起,tableName是我的一個錯誤,我編輯了這個問題。我已經發布了nsstring oggetto對象日誌,你可以看到它打印了stringaoggetto。但是查詢日誌在兩個示例中都輸出相同的結果。 – Cri1682 2011-05-18 06:57:28

回答

0
  1. 改爲此; [查詢cStringUsingEncoding:NSUTF8StringEncoding]我認爲這真的是你需要解決這個問題的關鍵。確保字符串被保留;這兩個都應該有效。 NSLog(@「%s」,[query cStringUsingEncoding:NSUTF8StringEncoding]); NSLog(@「%s」,[query UTF8String]);

  2. 這也許有一些有用的提示; http://www.how2s.org/index.php/How_to_get_started_with_SQLite_on_the_iPhone 簡化設計。

  3. 另外值得注意的是,你使用NULL,NULL,NULL。從sqlite3_exec語句中獲取錯誤數據。 http://www.sqlite.org/c3ref/exec.html有參考資料讓你開始。

  4. 您列出了多個問題。將其他問題分爲其他問題。插入與「更新」不同。將此問題關注於更新。

  5. 如果這一切都沒有幫助,NSString * oggetto如何設置,其中,相同的文件,差異文件,它是一個函數參數等?

+0

我試過[查詢cStringUsingEncoding:NSUTF8StringEncoding];儘管如此,但結果是一樣的。我也嘗試了第二段代碼(insertstm,它只是名稱,它是一個更新查詢,對不起,我已經編輯過這個問題),但沒有成功。我插入了nsstring的init,是select查詢的結果(select查詢沒有任何問題,它們完美地工作) – Cri1682 2011-05-18 08:50:01