什么时候使用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
这不是我问的,但是,例如:我已经看到插入完成与执行和步骤 –