我收到了sqlite3_prepare_v2的错误

时间:2012-04-25 06:23:28

标签: iphone ios sqlite xcode4

我正在创建一个应用程序,并使用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));
    }

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

我对这个问题很困惑,找不到任何办法摆脱这个问题。

2 个答案:

答案 0 :(得分:4)

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));
}

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

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

答案 1 :(得分:1)

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

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

其中sql是一个带有update语句的NSString,只需确保你的数据库是打开的

希望有所帮助