参见英文答案 >
Improve INSERT-per-second performance of SQLite?9个
我必须在sqlite数据库中添加大量数据,并且需要一些建议如何在iOS中执行该功能.我必须将大约1 GB的数据从服务器同步到iPhone sqlite数据库.
我必须在sqlite数据库中添加大量数据,并且需要一些建议如何在iOS中执行该功能.我必须将大约1 GB的数据从服务器同步到iPhone sqlite数据库.
解决方法
我建议你阅读这个Stack Overflow问题:
How do I improve the performance of SQLite?
一般来说,这是如何提高sqlite性能的一个非常好的看法,当我遇到速度问题试图在iOS上的sqlite数据库中插入100,000条记录时,它非常有用.
具体而言,事务的使用大大降低了整体插入速度.这是一小段示例代码,您可以看到我的意思:
const char *dbpath = [[Utilities pathInDocumentsFolder: MY_DATABASE] UTF8String]; const char *sql = "INSERT INTO Filters (Region,District,Territory) " \ "VALUES (?,?,?)"; sqlite3 *mapDB; char *sqliteError; sqlite3_stmt *insertStatement; sqlite3_open(dbpath,&mapDB); sqlite3_exec(mapDB,"BEGIN TRANSACTION",NULL,&sqliteError); if (sqlite3_prepare_v2(mapDB,sql,-1,&insertStatement,NULL) == sqlITE_OK) { for (NSArray *row in filtersArray) { sqlite3_bind_text(insertStatement,1,[[row objectAtIndex: 0] UTF8String],sqlITE_TRANSIENT); // Region sqlite3_bind_text(insertStatement,2,[[row objectAtIndex: 1] UTF8String],sqlITE_TRANSIENT); // District sqlite3_bind_text(insertStatement,3,[[row objectAtIndex: 2] UTF8String],sqlITE_TRANSIENT); // Territory if (sqlite3_step(insertStatement) != sqlITE_DONE) { break; } sqlite3_clear_bindings(insertStatement); sqlite3_reset(insertStatement); } } sqlite3_exec(mapDB,"END TRANSACTION",&sqliteError); sqlite3_finalize(insertStatement);
带有BEGIN和END TRANSACTION语句的sqlite3_exec是神奇的.