我正在iOS上执行一个按钮来更新SQlite数据。我可以使用Firefox SQLite Manager更新该值,但使用下面的代码遇到“无法提交,没有事务处于活动状态”的问题。请说清楚。感谢。
= - (id *)updateBanks {
sqlite3_stmt *statement = NULL;
const char *branch_no = "MAYBANK1";
const char *address = "KLCC";
NSFileManager *fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"banks.sqlite"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
{
NSLog(@"Cannot locate database file '%@'.", dbPath);
}
if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
{
NSLog(@"An error has occured.");
}
if(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)
{
const char *sql = "Update Maybank Set address = ? Where branch_no = ?";
if(sqlite3_prepare_v2(db, sql, -1, &statement, NULL)==SQLITE_OK){
sqlite3_bind_text(statement, 1, address, -1, SQLITE_TRANSIENT);
//sqlite3_bind_text(updateStmt, 1, [address.text UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(statement, 2, branch_no, -1, SQLITE_TRANSIENT);
}
}
char* errmsg;
sqlite3_exec(db, "COMMIT", NULL, NULL, &errmsg);
if(SQLITE_DONE != sqlite3_step(statement)){
NSLog(@"Error while updating. %s", sqlite3_errmsg(db));
}
else{
}
sqlite3_finalize(statement);
sqlite3_close(db);
return 0;
}
答案 0 :(得分:2)
任何更改数据库的命令(基本上,除SELECT之外的任何SQL命令)都将自动启动事务(如果尚未生效)。最后一个查询完成后,将提交自动启动的事务。
可以使用BEGIN命令手动启动事务。此类事务通常会持续到下一个COMMIT或ROLLBACK命令。
因此,已经提交了UPDATE语句的自动事务。 只有在您运行BEGIN时才需要运行COMMIT。
此外,您不得两次致电sqlite3_open
;第一个数据库连接将被泄露。
此外,您必须在执行COMMIT之前致电sqlite3_step
和sqlite3_finalize
。
此外,资源是只读的;你必须copy the database file out of the bundle才能修改它。