【发布时间】:2014-10-24 07:11:04
【问题描述】:
在我的 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?
【问题讨论】:
标签: ios iphone sqlite transactions bulkinsert