1

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

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 作为成功。但是数据库没有用新值更新。我怎样才能正确地做到这一点?谢谢

4

1 回答 1

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。)

于 2012-09-15T18:52:34.817 回答