Ios 如何在SWIFT和SQLITE 3中快速更新大量行?

Ios 如何在SWIFT和SQLITE 3中快速更新大量行?,ios,swift,sqlite,Ios,Swift,Sqlite,我有一个10000行的表,我必须从中更新1000行。 这花了我10-20秒。有没有办法更快地做到这一点 我的1000条sql语句如下: 更新表集合值=x,其中rowid=y(x和y是整数,rowid是sqlite3的内部rowid) 我为函数提供的sql语句: func executeSQL(sSQL:String) -> Bool { var bReturn:Bool=false; var statement:COpaquePointer = nil if sql

我有一个10000行的表,我必须从中更新1000行。 这花了我10-20秒。有没有办法更快地做到这一点

我的1000条sql语句如下:
更新表集合值=x,其中rowid=y
(x和y是整数,rowid是sqlite3的内部rowid)

我为函数提供的sql语句:

func executeSQL(sSQL:String) -> Bool {
    var bReturn:Bool=false;
    var statement:COpaquePointer = nil
    if sqlite3_prepare_v2(db, sSQL, -1, &statement, nil) != SQLITE_OK {
        println("Failed to prepare statement")
        //exit(1)
    }else{
        if sqlite3_step(statement) == SQLITE_DONE {
            println(sSQL);
            bReturn=true;
        }
        sqlite3_finalize(statement);
    }
    return bReturn;
}

您是否调用此
executeSQL
函数1000次?一种选择是只准备一次声明,而不是1000次。这就是事先准备好的声明的要点。然后每次重置它,而不是完成它。尝试替换为?:D如果使用ObjectiveC:)@rmaddy编写,则您编写的更新也需要很长时间。是的。这听起来很让人发问。你的意思是我应该将所有1000个更新连接到一个大SQL语句(stmt1;stmt2;)中,然后执行一次吗?不,一点也不。只准备一次语句,作为
updatetablesetvalue=?其中rowid=?
。然后在
executeSQL
中,您只需使用
sqlite3\u bind\u xxx
(其中
xxx
是适当的类型)绑定两个值,调用
sqlite3\u step
,然后
sqlite3\u reset
(而不是finalize)。您仍然调用函数1000次,但传入的是值,而不是预构建的查询。在事务中执行批处理更新应该更有效,因为在提交事务时,更改只保存一次到磁盘。-请参阅,以获取易于转换为Swift的C代码。您是否调用此函数1000次?一种选择是只准备一次声明,而不是1000次。这就是事先准备好的声明的要点。然后每次重置它,而不是完成它。尝试替换为?:D如果使用ObjectiveC:)@rmaddy编写,则您编写的更新也需要很长时间。是的。这听起来很让人发问。你的意思是我应该将所有1000个更新连接到一个大SQL语句(stmt1;stmt2;)中,然后执行一次吗?不,一点也不。只准备一次语句,作为
updatetablesetvalue=?其中rowid=?
。然后在
executeSQL
中,您只需使用
sqlite3\u bind\u xxx
(其中
xxx
是适当的类型)绑定两个值,调用
sqlite3\u step
,然后
sqlite3\u reset
(而不是finalize)。您仍然调用函数1000次,但传入的是值,而不是预构建的查询。在事务中执行批处理更新应该更有效,因为在提交事务时,更改只保存一次到磁盘。-请参阅,以获取易于转换为Swift的C代码。您是否调用此函数1000次?一种选择是只准备一次声明,而不是1000次。这就是事先准备好的声明的要点。然后每次重置它,而不是完成它。尝试替换为?:D如果使用ObjectiveC:)@rmaddy编写,则您编写的更新也需要很长时间。是的。这听起来很让人发问。你的意思是我应该将所有1000个更新连接到一个大SQL语句(stmt1;stmt2;)中,然后执行一次吗?不,一点也不。只准备一次语句,作为
updatetablesetvalue=?其中rowid=?
。然后在
executeSQL
中,您只需使用
sqlite3\u bind\u xxx
(其中
xxx
是适当的类型)绑定两个值,调用
sqlite3\u step
,然后
sqlite3\u reset
(而不是finalize)。您仍然调用函数1000次,但传入的是值,而不是预构建的查询。在事务中执行批处理更新应该更有效,因为在提交事务时,更改只保存一次到磁盘。-请参阅,以获取易于转换为Swift的C代码。