什麼時候使用sqlite3_step,什麼時候使用sqlite3_execute?IOS SQLite執行
來自好像sqlite3_step的文檔應該做一份準備好的聲明後使用,
但我爲什麼要運行一個以上的時間,爲什麼不使用sqlite3_execute?
什麼時候使用sqlite3_step,什麼時候使用sqlite3_execute?IOS SQLite執行
來自好像sqlite3_step的文檔應該做一份準備好的聲明後使用,
但我爲什麼要運行一個以上的時間,爲什麼不使用sqlite3_execute?
使用預準備語句的一個值是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。
等待..我有在那裏使用sqlite3_prepare_v2然後如果我使用sqlite3_exec或不?當我使用sqlite3_exec時,我還必須敲定嗎? –
不,調用sqlite3_finalize以刪除預準備語句。如果你使用sqlite3_prepare_v2,那麼你必須調用finalize。如果你調用sqlite3_exec,那麼你不需要調用其中任何一個。 sqlite_exec是sqlite3_prepare_v2(),sqlite3_step()和sqlite3_finalize()的快捷方式。 – jnortey
如果你想從一個sqlite數據庫讀取數據,你不需要使用sqlite3_execute – Ilario
這不是我問的,但是,例如:我已經看到插入完成與執行和步驟 –