我正在尝试更新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的成功值。但数据库未使用新值更新。 我该怎么做呢? 感谢
答案 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。)