【发布时间】:2011-05-18 19:07:15
【问题描述】:
您好,我正在编写一个需要 sqlite 和一个更新查询的 iphone 应用程序。很简单,为什么会这样:
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),sqlite3_bind_text 在 where 子句之后不起作用。使用相同的查询,如果我尝试出于测试目的将 ZTYPE 列设置为 ZNAME(但是任何其他列都不能设置为“Where”),它可以工作。为什么?
这是nsstring oggetto的init,是select查询的结果:
NSMutableString *oggetto;
oggetto=[NSString stringWithCString:(char *)sqlite3_column_text(selectstmt, 0)];
此字符串正确保留值(值为“stringaoggetto”),我已尝试使用 nslog。
【问题讨论】:
-
oggetto 有什么价值?您还应该绑定值而不是直接包含。
-
要么是因为您的 oggetto 与 @"stringaoggetto" 的值不同,要么是因为您的表名在两个查询中都不同。
-
对不起,不同的 tableName 是我的错误,我已经编辑了问题。我已经发布了 nsstring oggetto 对象日志,你可以看到它打印了 stringaoggetto。但是,查询日志在两个示例中打印相同的结果。