Chcę wstawić 40000 rekordów, które otrzymuję z usługi sieci Web do bazy danych sqlite w mojej aplikacji na iPada.Jak szybko wstawić 40000 rekordów do bazy danych sqlite w iPadzie?
Napisałem poniższy kod, ale zajmuje to około 20 minut, czy istnieje szybszy sposób?
- (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;
}
Podjęłbym otwieranie i zamykanie bazy danych z metody. To kosztuje cię sporo czasu. Stwórz i utrzymuj connectoin przez każde z 40 000 insertów, a następnie zniszcz je po zakończeniu. Ponadto, dzienniki NSLog mogą spowalniać faktyczną realizację. Próbowałem uruchomić jeden bez logów, aby zobaczyć, ile czasu to trwa. – Jeremy1026
Czy otwierasz ponownie bazę danych 40000 razy? (Powinieneś także uniknąć ponownej kompilacji instrukcji raz na rekord, a lepiej zrobić wszystkie wkładki w pojedynczej transakcji - ale to jest mniej ważne niż ponowne otwarcie dla każdego wiersza). –
Możesz wstawić wiele wierszy na insert z właściwym zapytaniem i zawijać cały proces w transakcji - w tej chwili SQLite musi spłukać się na dysk po każdym wstawieniu, który spowolni cię w dół. Możesz także ponownie użyć przygotowanego wyciągu, po prostu ponownie wiążąc zmienione wartości za każdym razem. –