【问题标题】:Sqlite UPDATE questionSqlite 更新问题
【发布时间】: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。但是,查询日志在两个示例中打印相同的结果。

标签: iphone ios sqlite


【解决方案1】:
  1. 改为这样做; [查询 cStringUsingEncoding:NSUTF8StringEncoding] 我认为这确实是您解决此问题所需的关键。确保字符串被保留;这两个都应该工作。

    NSLog(@"%s",[查询 cStringUsingEncoding:NSUTF8StringEncoding]);

    NSLog(@"%s",[查询 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 是如何设置的,在哪里,同一个文件,差异文件,它是一个函数参数等吗?

【讨论】:

  • 我试过 [查询 cStringUsingEncoding:NSUTF8StringEncoding]; insted,但结果是一样的。我也尝试过第二段代码(插入它只是名称,它是一个更新查询,很抱歉我已经编辑了问题)但没有成功。我已经插入了nsstring的init,是选择查询的结果(选择查询没有任何问题,它们工作得很好)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多