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

Posted

技术标签:

【中文标题】iOS 中 sqlite 数据库性能的注意事项【英文标题】:Considerations for sqlite database performance in iOS 【发布时间】:2013-09-08 09:14:24 【问题描述】:

我在我的 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】:

每个语句都有一次事务开销。

将所有语句包装到一个事务中。 手动执行BEGIN/END,或者直接将它们写入你的.sql文件。

【讨论】:

以上是关于iOS 中 sqlite 数据库性能的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3 视图影响性能?

ios中sqlite怎么存储数据的

iOS 中的数据模型持久性注意事项

微信iOS SQLite源码优化实践

iOS开发数据库篇—SQLite简单介绍

IOS-SQLite数据库使用详解