ios - 在sqlite中是否必须使用“END TRANSACTION”

标签 ios iphone sqlite transactions bulkinsert

在我的ios应用中,我使用for循环将大量数据插入sqlite,因为插入速度非常慢

 sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0); 

使用上面的语句之后,插入变得非常快,现在添加
sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);的插入又变慢了,

当我仅使用sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);插入会更快,当我添加sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);插入变得较慢时,我的问题是,在使用“BEGIN TRANSACTION”之后是否必须使用“END TRANSACTION”?我可以只使用sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);吗,因为只有Begin语句才能更快地插入

以下是我的代码
BOOL success = TRUE;
    sqlite3_stmt *addStmt;

    const char *strStyleInsertQuery = "insert or replace into tbl (id,hole_number,par,distance,delete_flag,course_id) values (?,?,?,?,?,?)";

    NSUInteger intCount = [arrHoles count];
    sqlite3_exec(dbh, "BEGIN TRANSACTION", 0, 0, 0);
    for (int i = 0; i < intCount; i++)
    {
        if(sqlite3_prepare_v2(dbh,strStyleInsertQuery, -1, &addStmt, NULL) == SQLITE_OK)
        {

            if([[arrHoles objectAtIndex:i] objectForKey:@"handicap"] == nil || [[[arrHoles objectAtIndex:i] objectForKey:@"handicap"] isKindOfClass:[NSNull class]])
                sqlite3_bind_text(addStmt, 7, [@"" UTF8String], -1, SQLITE_TRANSIENT);
            else
                sqlite3_bind_text(addStmt, 7, [[NSString stringWithFormat:@"%d",[[[arrHoles objectAtIndex:i] objectForKey:@"handicap"] intValue]] UTF8String], -1, SQLITE_TRANSIENT);

        }
        if(SQLITE_DONE != sqlite3_step(addStmt))
        {
            success = FALSE;
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(dbh));
        }
        //Reset the add statement.
        sqlite3_reset(addStmt);
    }
    sqlite3_exec(dbh, "END TRANSACTION", 0, 0, 0);   //IS THIS MANDATORY?

最佳答案

当您既不使用BEGIN也不使用END时,数据库将为每个语句使用自动事务,这很慢。

当您同时使用BEGIN和END时,在事务中完成的所有更改都将被写入磁盘并与END同步。

当您使用BEGIN而不是END时,在事务中完成的更改将不会写入磁盘。
这肯定比使用END更快,但会对数据库中数据的正确性产生负面影响。

关于ios - 在sqlite中是否必须使用“END TRANSACTION”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26543110/

相关文章:

ios - 如何为 Xcode 自定义 ViewController 模板文件?

ios - UIView设置约束

objective-c - 替代 Objective-C 中的 switch 语句

iphone - 如何从委托(delegate)外部设置 super View ?

iphone - 在执行方法之前检查每个 bool 值的更简单方法?

python - 如何在调用 SQLite 的 python 中按名称引用列?

objective-c - 谷歌加 iOS SDK : how to get logged in user email?

ios - 链接以列出 iPhone App Store 中开发人员的所有应用程序

ios Sqlite 数据库 - 选择查询

android - 整个应用程序生命周期中的 getWritableDatabase() 实例