16秒在iPhone上的SQLite DB中插入1000行?
我试图在sqlite数据库中插入1000行,但耗时超过16秒。。我的代码中是否有我没有看到的错误16秒在iPhone上的SQLite DB中插入1000行?,iphone,sqlite,Iphone,Sqlite,我试图在sqlite数据库中插入1000行,但耗时超过16秒。。我的代码中是否有我没有看到的错误 NSLog(@"--start--"); if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { static sqlite3_stmt *compiledStatement; for(int k = 0; k < 1000; k++) sqlite3_exec(database,
NSLog(@"--start--");
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
static sqlite3_stmt *compiledStatement;
for(int k = 0; k < 1000; k++)
sqlite3_exec(database, [[NSString stringWithFormat:@"insert into myTable (id, name) values ('%i', 'a')", k] UTF8String], NULL, NULL, NULL);
sqlite3_finalize(compiledStatement);
sqlite3_close(database);
}
NSLog(@"--stop--");
start : 2010-11-27 11:21:11.704
stop : 2010-11-27 11:21:27.908
NSLog(@--start-->);
if(sqlite3_打开([databasePath UTF8String],&database)==SQLITE_正常){
静态sqlite3_stmt*编译语句;
对于(int k=0;k<1000;k++)
sqlite3_exec(数据库,[[NSString stringWithFormat:@“插入myTable(id,名称)值(“%i”,“a”)”,k]UTF8String],NULL,NULL,NULL);
sqlite3_最终确定(编译语句);
sqlite3_关闭(数据库);
}
NSLog(@--stop-->);
开始时间:2010-11-2711:21:11.704
停止:2010-11-2711:21:27.908
谢谢 您可能需要执行大容量插入,而不是执行1000次sql访问这里没有硬性数字,但这正是我所期望的。使用批量插入,也可以尝试不同的捆绑大小。您确定在一个事务中进行插入吗?
如果在每次插入时自动提交,SQLite的速度会非常慢。我最后在插入查询周围添加了这两行:
sqlite3_exec(database, "BEGIN", 0, 0, 0);
sqlite3_exec(database, "COMMIT", 0, 0, 0);
start : 2010-11-27 13:07:26.022
stop : 2010-11-27 13:07:26.285
谢谢你的帮助 这是由于SQLite的自动提交。您需要使用以下命令调用
sqlite3\u exec
:
BEGIN TRANSACTION
现在像以前一样插入所有记录。等你做完了。执行:
COMMIT TRANSACTION
这应该能奏效
也将解释为什么它会慢得多。实际上,它比常见问题解答中所述的每秒几十次查询要快得多,但由于iPhone上闪存的性质,这似乎很正常。我想,好吧,但我会尝试进行批量插入,看看是否有更好的性能。。试图获取代码示例,但找不到有效的示例。。你会怎么做?THX只需为insert查询创建整个字符串,并在循环中用分号分隔。循环终止后,只发送一次查询。
-(void)doBatchExecution
{
const char *dbpath = [[DatabaseManager getDataBasePath] UTF8String];
if (sqlite3_open(dbpath, &db) == SQLITE_OK)
{
char* errorMessage;
sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errorMessage);
NSString *query=@"YOUR_SQL_QUERY";
if (sqlite3_exec(db, [query UTF8String], NULL, NULL, &errorMessage) != SQLITE_OK)
NSLog(@"DB Error. category transacation '%s'", sqlite3_errmsg(db));
sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errorMessage);
}
}