Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
16秒在iPhone上的SQLite DB中插入1000行?_Iphone_Sqlite - Fatal编程技术网

16秒在iPhone上的SQLite DB中插入1000行?

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,

我试图在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, [[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);
   }

 }