Webサービスから取得した40000のレコードをiPadアプリのsqliteデータベースに挿入します。iPadのsqliteデータベースに40000レコードを高速に挿入する方法
私は次のコードを書いていますが、それは約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を作成して永続させ、それが完了すると破棄します。また、NSLogが実際の実行を遅くしている可能性があります。私はどれくらいの時間がかかるかを見るためにログを使わずに1つを実行しようとします。 – Jeremy1026
データベースを40000回再オープンしますか? (レコードごとにステートメントを再コンパイルしないでください。すべての挿入を1回のトランザクションで行う方が良いですが、各行の再オープンよりも重要です。 –
右のクエリでインサートごとに複数の行を挿入し、プロセス全体をトランザクションにラップすることができます。挿入が終わるたびにSQLiteがディスクにフラッシュする必要があります。また、準備された文を再利用するだけで、毎回変更された値を再バインドすることができます。 –