什么时候使用 sqlite3_step,什么时候使用 sqlite3_execute?
从文档看来,在准备好声明后应该使用 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 性能的更多信息,请参阅此 stackoverflow 帖子。