Iphone sqlite3更新在ios中不工作

Iphone sqlite3更新在ios中不工作,iphone,ios,sqlite,Iphone,Ios,Sqlite,我正在尝试更新sqlite数据库。这是我正在使用的代码 if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { const char * sql; sql = "update tms set name = ?,place=?,stars=? where id=?"; sqlite3_stmt *selectStatement; //pr

我正在尝试更新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_步骤时,我得到值101作为成功。但数据库不会用新值更新。 我怎样才能正确地做到这一点?
谢谢

我同意@ott的建议,即确保数据库位于
文档
目录中(尽管我认为这会给您带来一个错误)

我还将仔细检查
[[payloadDict valueForKey:@“rowid”]integerValue]
返回的值,以确保它与表中现有行之一的
id
列中的值匹配。如果它与任何内容都不匹配,
sqlite3\u步骤
将返回
SQLITE\u DONE
,即使没有更新任何内容


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

我同意@ott的建议,即确保数据库位于
文档
目录中(尽管我认为这会给您带来一个错误)

我还将仔细检查
[[payloadDict valueForKey:@“rowid”]integerValue]
返回的值,以确保它与表中现有行之一的
id
列中的值匹配。如果它与任何内容都不匹配,
sqlite3\u步骤
将返回
SQLITE\u DONE
,即使没有更新任何内容


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

您的数据库路径是什么?你把数据库复制到可写文档目录了吗?你的数据库路径是什么?是否已将数据库复制到可写文档目录?