Можно ли реструктурировать ваш код так, чтобы вы не открывали базу данных на каждой итерации?
- Открытая база данных
- Начать транзакцию sqlite3_exec (..., "BEGIN", ...)
- составить заявление
- повторный набор данных
- завершить скомпилированный оператор
- Фиксация транзакции sqlite3_exec (..., {"ROLLBACK" или "COMMIT"}, ...)
- Закрыть базу данных
Это в отличие от того, что у вас сейчас
- Повторный набор данных
- открытая база данных
- оператор компиляции
- вставить запись
- завершить скомпилированный оператор
- закрыть базу данных
Издержки, связанные с тем, как вы выполняете, отражают производительность. Попробуйте выполнить рефакторинг в соответствии с методом, который я описал выше, и посмотрите, как вы это делаете.
EDIT
Я переформатировал ваш код, чтобы указать, о чем я говорю. Кроме того, я думаю, что другая производительность, которая вас поразила (как указал другой пользователь) - это вызов JSON. Это может быть НАСТОЯЩИМ, что так сильно вас тормозит.
dbPath=[self.databasePath UTF8String];
if(sqlite3_open(dbPath,&database)==SQLITE_OK)
{
sqlite3_exec(database, "BEGIN", 0, 0, 0);
const char *sqlstatement="insert into artist values(?,?,?,?,?)";
sqlite3_stmt *compiledstatement;
if(sqlite3_prepare_v2(database,sqlstatement , -1, &compiledstatement, NULL)==SQLITE_OK)
{
int hasError= 0;
for(i=4611; hasError == 0 && i<=34803; i++)
{
NSURLResponse *response;
NSError *err;
NSData *data= [NSURLConnection sendSynchronousRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"API&id=%i",i]]] returningResponse:&response error:&err];
if(data.length>0)
{
NSDictionary *jsonDict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err];
// sqlite3_exec(database, "BEGIN", 0, 0, 0);
sqlite3_bind_text(compiledstatement,1,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"id"] UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(compiledstatement,2,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"name"] UTF8String], -1, SQLITE_TRANSIENT);
if([[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"description"])
sqlite3_bind_text(compiledstatement,3,[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"description"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,3,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if([[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"links"]objectForKey:@"website"])
sqlite3_bind_text(compiledstatement,4,[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"links"]objectForKey:@"website"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,4,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if([[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"media"]objectForKey:@"low_res_images"]objectAtIndex:0]objectForKey:@"url"])
sqlite3_bind_text(compiledstatement,5,[[[[[[[jsonDict objectForKey:@"artistDetail"]objectForKey:@"artist"]objectForKey:@"media"]objectForKey:@"low_res_images"]objectAtIndex:0] objectForKey:@"url"] UTF8String], -1, SQLITE_TRANSIENT);
else
sqlite3_bind_text(compiledstatement,5,[@"" UTF8String], -1, SQLITE_TRANSIENT);
if(sqlite3_step(compiledstatement)==SQLITE_DONE)
{
NSLog(@"done %i",i);
}
else {
NSLog(@"ERROR");
hasError= 1;
}
}
sqlite3_reset(compiledstatement);
}
// Really need to check error conditions with commit/rollback
if( hasError == 0 ) {
sqlite3_exec(database, "COMMIT", 0, 0, 0);
}
else {
sqlite3_exec(database, "ROLLBACK", 0, 0, 0);
}
}
sqlite3_close(database);
}
else {
NSLog(@"error");
}