在我的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/