【问题标题】:I am getting an error with sqlite3_prepare_v2sqlite3_prepare_v2 出现错误
【发布时间】:2012-04-25 06:23:27
【问题描述】:

我正在创建一个应用程序,并使用 sqlite 进行更新。下面是我的一段代码:

    NSFileManager *fileMgr = [NSFileManager defaultManager];
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"appforoffice.sqlite"];
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    if(!success)
    {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    if(!(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK))
    {
        NSLog(@"An error has occured.");
    }

    const char *sql = "UPDATE settings SET `value`='Off' WHERE `type`=?";
if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK)
    {
        if(sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1, SQLITE_TRANSIENT) == SQLITE_OK)
        {
            if(sqlite3_step(updateStmt) == SQLITE_DONE) {
                NSLog(@"Update Done successfuly");
            }
            else {
                 NSLog(@"Error while updating. '%s'", sqlite3_errmsg(database));
            }

            sqlite3_finalize(updateStmt);
            sqlite3_close(database);
        }
        else
        {
            NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database));
        }
    }
    else
    {
        NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
    }

但是伙计们,我没有收到任何错误。但问题是,数据库表不受查询影响。我确信查询完全没问题。

我对这个问题感到困惑,找不到任何解决办法。

【问题讨论】:

  • 如果您想解决此类数据库问题,您需要发布查询以及可能的架构。
  • @SoumalyaBanerjee 请检查这里提到的问题stackoverflow.com/questions/39916124/…。升级到 iOS-10 后我也遇到了类似的问题。

标签: iphone ios sqlite xcode4


【解决方案1】:

sqlite3_prepare_v2() 不返回布尔值,因此用! 测试其返回值是错误的。来自reference

成功时,sqlite3_prepare() 系列例程返回 SQLITE_OK; 否则返回错误码。

所以你的代码应该看起来更像这样:

if (sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) == SQLITE_OK)
{
    if (sqlite3_bind_text(updateStmt, 1, [updateType UTF8String], -1,
        SQLITE_TRANSIENT) == SQLITE_OK)
    {
        ... call update API ...
    }
    else
    {
        NSLog(@"Error while binding variable. '%s'", sqlite3_errmsg(database));
    }
}
else
{
    NSLog(@"Error while creating update statement. '%s'", sqlite3_errmsg(database));
}

编辑(用整个查询更新问题后):

我不喜欢查询中 ` 字符的外观;删除它们,它应该工作。

【讨论】:

  • 我完全按照你告诉我的去做了。现在我在绑定变量时没有收到错误错误。 '绑定或列索引超出范围'.
  • OK,绑定列索引从0开始;将语句中的1 更改为0
  • 我解决了这个错误,我的查询中有一个愚蠢的错误。现在我没有收到任何错误。但主要问题是,更新查询没有运行,即数据库表不受影响。但是查询完全没问题。
  • 按照您的建议,在编辑了我的代码之后,我已经编辑了我的问题。
  • @SoumalyaBanerjee 我对从 0 开始的列索引的评论是错误的,正如你所说,它们从 1 开始。
【解决方案2】:

我更喜欢直接使用 sql 命令而无需任何准备或绑定方法

sqlite3_exec(database,[sql UTF8String],nil,nil,nil);

其中 sql 是一个具有更新语句的 NSString,只要确保你的数据库是打开的

希望对你有帮助

【讨论】:

  • 当我使用sqlite3_exec 时,我没有收到任何错误,它没有任何效果,即更新查询没有运行。但是查询完全没问题。
  • 我一直在使用它并且它工作正常,确保你打开了数据库'if(sqlite3_open([_dbPath UTF8String],&database)==SQLITE_OK)'
猜你喜欢
  • 2014-05-02
  • 2016-07-25
  • 2011-08-20
  • 2015-02-07
  • 2013-01-30
  • 2011-03-18
  • 1970-01-01
  • 2014-03-13
相关资源
最近更新 更多