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 数据库性能的注意事项的主要内容,如果未能解决你的问题,请参考以下文章