2013-10-15 44 views
0

什麼時候使用sqlite3_step,什麼時候使用sqlite3_execute?IOS SQLite執行

來自好像sqlite3_step的文檔應該做一份準備好的聲明後使用,

但我爲什麼要運行一個以上的時間,爲什麼不使用sqlite3_execute?

+0

如果你想從一個sqlite數據庫讀取數據,你不需要使用sqlite3_execute – Ilario

+0

這不是我問的,但是,例如:我已經看到插入完成與執行和步驟 –

回答

0

使用預準備語句的一個值是SQLite不需要重新編譯大量插入/更新的SQL語句。如果我有100個刀​​片使用相同的語句,但插入不同的值,它會是這個樣子:

if (sqlite3_open(dbpath, &_database) == SQLITE_OK){ 
    char *errMsg; 
    const char *sql_stmt = [query UTF8String]; 

    for each insert query{ 
     if (sqlite3_exec(_database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK){ 
      // Each statement is recompiled 
     } 
    } 

    sqlite3_close(_database); 
} 

但是當你使用預處理語句具有約束力,但它看起來更像是這樣的:

for each insert query { 

    sqlite3_bind_text(stmt, 1, firstColumn, -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(stmt, 2, secondColumn, -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(stmt, 3, thirdColumn, -1, SQLITE_TRANSIENT); 

    sqlite3_step(stmt); 

    sqlite3_clear_bindings(stmt); 
    sqlite3_reset(stmt); 

} 
fclose (pFile); 
sqlite3_finalize(stmt); 
sqlite3_close(db); 

現在不是每次調用exec語句,每次都必須編譯查詢,我自己執行綁定,然後調用sqlite3_step來評估每個語句。性能差異可能非常顯着。

要回答您的問題,請在您有一個獨立查詢時使用sqlite3_execute,並在執行批量查詢時使用預準備語句,綁定和sqlite3_step。我認爲有些人會爭辯說,你應該在任何可以使用的地方使用準備好的語句和綁定,但坦率地說,如果你從不進行批量查詢,並且所有的查詢都很簡單和孤立,那麼你應該使用方便的sqlite_exec方法(就是它所做的對於!)。

有關更多關於sqlite性能的信息,請參閱this stackoverflow post

+0

等待..我有在那裏使用sqlite3_prepare_v2然後如果我使用sqlite3_exec或不?當我使用sqlite3_exec時,我還必須敲定嗎? –

+1

不,調用sqlite3_finalize以刪除預準備語句。如果你使用sqlite3_prepare_v2,那麼你必須調用finalize。如果你調用sqlite3_exec,那麼你不需要調用其中任何一個。 sqlite_exec是sqlite3_prepare_v2(),sqlite3_step()和sqlite3_finalize()的快捷方式。 – jnortey