0

什么时候使用 sqlite3_step,什么时候使用 sqlite3_execute?

从文档看来,在准备好声明后应该使用 sqlite3_step,

但为什么我要运行它不止一次,为什么不使用 sqlite3_execute?

4

1 回答 1

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 性能的更多信息,请参阅此 stackoverflow 帖子

于 2013-10-15T14:41:05.057 回答