iOS sqlite无法提交,没有事务处于活动状态

时间:2014-06-10 07:48:01

标签: ios sqlite

我正在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;

}

1 个答案:

答案 0 :(得分:2)

documentation说:

  

任何更改数据库的命令(基本上,除SELECT之外的任何SQL命令)都将自动启动事务(如果尚未生效)。最后一个查询完成后,将提交自动启动的事务。

     

可以使用BEGIN命令手动启动事务。此类事务通常会持续到下一个COMMIT或ROLLBACK命令。

因此,已经提交了UPDATE语句的自动事务。 只有在您运行BEGIN时才需要运行COMMIT。


此外,您不得两次致电sqlite3_open;第一个数据库连接将被泄露。

此外,您必须在执行COMMIT之前致电sqlite3_stepsqlite3_finalize

此外,资源是只读的;你必须copy the database file out of the bundle才能修改它。