2012-04-18 4 views
2

Я не совсем понимаю sqlite3_finalize. Мой начальный код.Я не совсем понимаю sqlite3_finalize

while (j < Autors.count) 
{ 
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
{ 
    sqlite3_bind_int(compiledStatement, 1, ((AuthorSettings *)[Autors objectAtIndex:j]).authorId); 
    if(sqlite3_step(compiledStatement) != SQLITE_DONE) 
    {  
     NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database)); 
     sqlite3_busy_timeout(database, 5); 
    } 
    else 
    {  
     if(sqlite3_prepare_v2(database, sqlStatement_1, -1, &compiledStatement, NULL) == SQLITE_OK) 
     { 
      sqlite3_bind_int(compiledStatement, 1, bookId); 
      if(sqlite3_step(compiledStatement) != SQLITE_DONE) 
      {  
       NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database)); 
       sqlite3_busy_timeout(database, 5); 
      }  
      else j++;  
     } 
     else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database)); 
    }  
} 
} 
sqlite3_finalize(compiledStatement); 

Я добавил функции sqlite3_finalize. Пожалуйста, проверьте меня.

while (j < Autors.count) 
{ 
sqlite3_finalize(compiledStatement); //**added 
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
{ 
    sqlite3_bind_int(compiledStatement, 1, ((AuthorSettings *)[Autors objectAtIndex:j]).authorId); 
    if(sqlite3_step(compiledStatement) != SQLITE_DONE) 
    {  
     NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database)); 
     sqlite3_busy_timeout(database, 5); 
    } 
    else 
    { 
     sqlite3_finalize(compiledStatement); //**added 
     if(sqlite3_prepare_v2(database, sqlStatement_1, -1, &compiledStatement, NULL) == SQLITE_OK) 
     { 
      sqlite3_bind_int(compiledStatement, 1, bookId); 
      if(sqlite3_step(compiledStatement) != SQLITE_DONE) 
      {  
       NSLog(@"sqlite3_step error %s", sqlite3_errmsg(database)); 
       sqlite3_busy_timeout(database, 5); 
      }  
      else j++;  
     } 
     else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database)); 
    }  
} 
} 
sqlite3_finalize(compiledStatement); 

ответ

6

sqlite3_finalize противоположно sqlite3_prepare_v2. Таким образом, ваш код должен выглядеть примерно так:

sqlite3_prepare_v2(...); 
while() { 
    sqlite3_reset(...); 
    sqlite3_bind_int(...); 
    sqlite3_step(...); 
} 
sqlite3_finalize(...); 

Вы не хотите готовить заявления более, чем необходимо.

+0

Если вы используете sqlite3_exec, вам также нужно использовать sqlite3_finalize? – ademar111190

+1

@ ademar111190 Как говорится в документации: «Функция sqlite3_finalize() вызывается для удаления подготовленного оператора». Поэтому, если вы не подготовили заявление, нет необходимости его завершать. –

+0

спасибо, похоже, это просто, если я вызываю sqlite3_finalize с sqlite3_exec, иногда я получаю ошибку времени выполнения. – ademar111190

Смежные вопросы