iOS中sqlite数据库性能的注意事项

时间:2013-09-08 09:14:24

标签: ios database file sqlite insert

我在我的iOS应用中直接使用sqlite数据库,而没有利用Core Data。当应用程序启动时,我需要它插入几组表行,其中包含大量数据,这些数据在应用程序的使用过程中是必需的,并且是固定的数据集(例如,我有一个数据库表用于列表用户可以在应用程序中选择的国家/地区)。我在应用程序的.sql文件中插入了这些数据,因为我从用户安装和启动应用程序的第一次开始就需要在数据库中提供这些数据,所以我写了一个首先复制的方法数据库到Documents,然后读取文件并执行数据库插入,我在application:didFinishLaunchingWithOptions:中调用此方法。

然而,我发现执行大量插入实际上是一个缓慢的操作。我这样做:

+ (void)insertFileContent:(NSString *)fileContent intoDatabase:(sqlite3 *)database
{
   NSArray *lines = [fileContent componentsSeparatedByString:@"\r\n"];

   for (NSString *line in lines) {
      const char *sqlStatement = [line UTF8String];
      sqlite3_stmt *compiledStatement;

      if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

        if(sqlite3_step(compiledStatement) == SQLITE_DONE) {
            // Insertion was ok
        }
        else {
            NSLog(@"%d",sqlite3_step(compiledStatement));
        }

        sqlite3_finalize(compiledStatement);
      }
   }
}

数据库在调用此方法之前只打开一次,并在返回时关闭。正如我所说,我需要将大量数据插入到数据库中以使应用程序正常工作,并且需要几分钟才能完成。我一直在寻找一种方法来显着减少这个时间,但我没有成功。

我怎么能处理这个?有没有办法让这个操作更快,和/或有没有办法在用户安装应用程序时将数据插入数据库,而不是等待直到启动时间?

提前致谢

1 个答案:

答案 0 :(得分:0)

每个语句都有一次交易开销。

将所有语句包装到单个事务中。 手动执行BEGIN / END,或者只将其写入.sql文件。