2013-10-15 45 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