sqlite3更新不能在ios中工作
我正在尝试更新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。 但数据库不会更新为新的值。 我怎样才能正确地做到这一点? 谢谢
我同意@ ott的出色build议,确保数据库位于Documents
目录中(尽pipe我会认为这会给你一个错误)。
我还仔细检查了[[payloadDict valueForKey:@"rowid"] integerValue]
返回的值,以确保它与表中某个现有行的id
列中的值相匹配。 如果它不匹配任何东西, sqlite3_step
将返回SQLITE_DONE
即使没有更新。
另外请注意,你可能也想确保id
值是作为数字值存储的,而不是文本string,因为sqlite是非常松懈的,让你存储在你最初插入数据时最初指定的任何数据types的值,无论如何表被定义),而且我不确定如果数据最初是作为文本值存储的话,查找数字匹配的WHERE
子句是否会成功。 如果你使用了一个像id INTEGER PRIMARY KEY AUTOINCREMENT
这样的id
列定义,系统自动为你定义了这个值,这不是一个问题,但是如果你手工填充了id
列,那么可能需要仔细检查。 (一般来说,在将string解释为dynamic数字方面做得非常好,但是有一些奇怪的情况是有问题的:例如,如果在数字字段中存储了string值“5,127”,如果稍后尝试检索它的数值,sqlite将不知道如何处理文本值“5,127”中的逗号,并将数值解释为5,而不是5127.)