sqlite3更新无法在ios中运行

时间:2012-09-15 17:57:10

标签: iphone ios sqlite

我正在尝试更新sqlite db。这是我正在使用的代码

if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {

        const char * sql;
        sql = "update tms  set name = ?,place=?,stars=?  where id=?";

        sqlite3_stmt *selectStatement;

        //prepare the select statement
        int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL);
        if(returnValue == SQLITE_OK)
        {
            sqlite3_bind_text(selectStatement, 1,[[payloadDict  valueForKey:@"userName"] UTF8String] , [[payloadDict  valueForKey:@"userName"] length],SQLITE_STATIC);
            sqlite3_bind_text(selectStatement, 2,[[payloadDict  valueForKey:@"locName"] UTF8String], [[payloadDict  valueForKey:@"locName"] length],SQLITE_STATIC);
            sqlite3_bind_int(selectStatement, 3, [[payloadDict  valueForKey:@"starCount"] integerValue]);
            sqlite3_bind_int(selectStatement, 4, [[payloadDict  valueForKey:@"rowid"] integerValue]);
            int success = sqlite3_step(selectStatement);
            if(success == SQLITE_DONE)
            {
                isExist = TRUE;
            }
            else {
                //NSAssert1(0,@"Error: Failed to Update %s",sqlite3_errmsg(database));
            }
    }

执行sqlite3_step时,我获得了101的成功值。但数据库未使用新值更新。 我该怎么做呢? 感谢

1 个答案:

答案 0 :(得分:1)

我同意@ ott关于确保数据库位于Documents目录中的出色建议(尽管我认为这会给你一个错误)。

我还会仔细检查[[payloadDict valueForKey:@"rowid"] integerValue]返回的值,以确保它与表中某个现有行的id列中的值匹配。如果它与任何内容都不匹配,即使没有更新,sqlite3_step也会返回SQLITE_DONE

另请注意,您可能还需要确保将id值存储为数值,而不是文本字符串,因为sqlite非常宽松,因为您可以将值存储在最初指定的数据类型中插入数据,无论表是如何定义的,并且如果数据最初存储为文本值,我不确定寻找数字匹配的WHERE子句是否会成功。如果您使用id列定义,例如id INTEGER PRIMARY KEY AUTOINCREMENT,系统会自动为您定义值,这不是问题,但如果您手动填充id列,则可能要仔细检查一下。 (通常它在将字符串解释为动态数字方面表现相当不错,但有一些奇怪的情况有问题:例如,如果您在数字字段中存储字符串值“5,127”,如果您稍后再尝试要检索其数值,sqlite将不知道如何处理文本值“5,127”中的逗号,并将数值解释为5,而不是5127。)