Voglio inserire 40000 record che ottengo da un servizio Web in un database SQLite nella mia app per iPad.Come inserire rapidamente 40000 record in un database sqlite in un iPad
Ho scritto il seguente codice, ma ci vogliono circa 20 minuti, c'è un modo più veloce?
- (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;
}
Prenderei l'apertura e la chiusura del database fuori dal metodo. Ti sta costando una buona quantità di tempo. Creare e mantenere il connectoin attraverso ciascuno dei 40.000 inserti e quindi distruggerlo una volta completato. Inoltre, NSLogs potrebbe rallentare l'esecuzione effettiva. Proverei a eseguire uno senza i registri per vedere quanto tempo ci vuole. – Jeremy1026
Riapri il database 40000 volte? (Si dovrebbe anche evitare di ricompilare la dichiarazione una volta per record, ed è meglio fare tutti gli inserimenti in una singola transazione, ma è meno importante della riapertura per ogni riga). –
È possibile inserire più righe per inserto con la query corretta e avvolgere l'intero processo in una transazione: al momento SQLite deve eseguire lo svuotamento su disco dopo ogni inserimento che rallenterà il processo verso il basso. È inoltre possibile riutilizzare l'istruzione preparata, riconciliando nuovamente i valori modificati ogni volta –