嗨,我写一个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