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

时间:2010-11-27 10:52:07

标签: 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, [[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

thx!

6 个答案:

答案 0 :(得分:13)

这是由于SQLite的自动提交。您需要通过以下方式致电sqlite3_exec

BEGIN TRANSACTION

现在像以前一样插入所有记录。完成后。执行:

COMMIT TRANSACTION

这应该可以解决问题。

同样this FAQ question将解释为什么它会慢得多。它实际上比FAQ中所述的每秒几十个查询要快得多,但由于iPhone上闪存的性质,这似乎是正常的。

答案 1 :(得分:7)

我最后在插入查询中添加了这两行:

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

感谢您的帮助!

答案 2 :(得分:1)

你可能需要进行批量插入而不是1000次访问sql

答案 3 :(得分:1)

您确定在一次交易中进行了插入吗? 如果你自动提交每个插入,SQLite非常慢。

答案 4 :(得分:1)

-(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);
   }

 }

答案 5 :(得分:0)

这里没有硬数字,但它是关于我期望的。使用批量插入,也可以尝试不同的包大小。