我想将我从Web服务获得的40000条记录插入到我的iPad应用程序中的sqlite数据库中。如何将40000条记录快速插入到iPad中的sqlite数据库中
我写了下面的代码,但大约需要20分钟,有没有更快的方法?
- (NSArray *)insertPriceSQLWithPrice:(Price *) price
{
SQLiteManager *dbInfo = [SQLiteManager sharedSQLiteManagerWithDataBaseName:@"codefuel_catalogo.sqlite"];
sqlite3 *database;
NSString *querySQL=[self formatStringQueryInsertWithTable:@"prices_list" andObject:price];
if(sqlite3_open([dbInfo.dataBasePath UTF8String], &database) == SQLITE_OK)
{
sqlite3_stmt * compiledStatement;
const char *query_stmt = [querySQL UTF8String];
int result = sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL);
if (result == SQLITE_OK)
{
int success = sqlite3_step(compiledStatement);
NSLog(@"el numero de success es -> %i",success);
if (success == SQLITE_ERROR)
NSLog(@"Error al insertar en la base de datps");
}
else
NSLog(@"Error %@ ERROR!!!!",querySQL);
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
return nil;
}
我会把数据库的打开和关闭放在方法之外。这花费了相当长的时间。通过每个40,000个插入创建并坚持connectoin,然后在完成后将其销毁。另外,NSLogs可能会减慢实际执行速度。我会尝试运行一个没有日志来看看需要多长时间。 – Jeremy1026
你重新打开数据库40000次吗? (您还应该避免每条记录重新编译一次语句,最好在单个事务中执行所有插入操作 - 但这比重新打开每行更重要)。 –
您可以使用正确的查询为每个插入插入多行,并将整个进程包含在一个事务中 - 此时SQLite必须在每次插入后刷新到磁盘,这会使您放慢速度。您也可以重新使用准备好的语句,每次重新绑定更改的值 –