2012-04-18 51 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_finalizesqlite3_prepare_v2相反。所以你的代碼看起來應該是這樣的:

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

你不想讓你的語句超出必要的準備。

+0

如果你使用sqlite3_exec你需要使用sqlite3_finalize呢? – ademar111190 2012-11-06 15:30:17

+1

@ ademar111190正如文檔所述,「調用sqlite3_finalize()函數來刪除準備好的語句。」所以如果你沒有準備一份聲明,就沒有必要確定它。 – 2012-11-06 16:01:52

+0

謝謝,似乎只是,如果我用sqlite3_exec調用sqlite3_finalize有時我得到一個運行時錯誤。 – ademar111190 2012-11-06 17:24:16