嗨,我寫一個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的。
oggetto有什麼價值?您還應該綁定值而不是直接包含值。 – Anna 2011-05-17 16:34:10
或者是因爲您的oggetto與@「stringaoggetto」的值不同或者您的tableNames在兩個查詢中都不相同。 – SayeedHussain 2011-05-17 18:35:57
對不起,tableName是我的一個錯誤,我編輯了這個問題。我已經發布了nsstring oggetto對象日誌,你可以看到它打印了stringaoggetto。但是查詢日誌在兩個示例中都輸出相同的結果。 – Cri1682 2011-05-18 06:57:28