【问题标题】:Flex / Air sqlite async issueFlex / Air sqlite 异步问题
【发布时间】:2009-10-28 11:56:07
【问题描述】:

我正在编写一个应用程序,它将一个 csv 文件解析为一个数组,然后将该数组插入一个 sqlite 数据库。我在异步连接到 sqlite 数据库时遇到问题,出现 3106 错误......我认为问题是它在前一个语句完成之前执行下一个语句,但我找不到处理方法这。任何帮助将不胜感激。

public function addData(categories:Array):void{
                status = "Adding data to table";
                var insrtStmt:SQLStatement = new SQLStatement();
                    insrtStmt.sqlConnection = conn;


                        for(var i:int=categories.length-1; i>=0; i--){
                            insrtStmt.text = "";
                            insrtStmt.text += "INSERT INTO masterlist ";
                            insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
                            insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) ";
                            insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,";
                            insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);";
                            insrtStmt.parameters["@mainid"] = categories[i].mainid;
                            insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate;
                            insrtStmt.parameters["@tradeId"] = categories[i].tradeId;
                            insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair;
                            insrtStmt.parameters["@account"] = categories[i].account;
                            insrtStmt.parameters["@buySell"] = categories[i].buySell;
                            insrtStmt.parameters["@customer"] = categories[i].customer;
                            insrtStmt.parameters["@date"] = categories[i].date;
                            insrtStmt.parameters["@additionalid"] = categories[i].additionalid;
                            insrtStmt.parameters["@dealType"] = categories[i].dealType;
                            insrtStmt.parameters["@traderName"] = categories[i].traderName;
                            insrtStmt.parameters["@genericType"] = categories[i].genericType;
                            insrtStmt.parameters["@owner"] = categories[i].owner;
                            insrtStmt.execute();
                            }

                }

【问题讨论】:

    标签: apache-flex actionscript-3 sqlite air


    【解决方案1】:

    如果您认为问题在于它仍在执行,只需为它的“结果”事件向语句添加一个事件侦听器,然后触发下一条语句。

    public function addDataSet( categories : Array ) : void {
        _categories = categories;
        _loopcounter = categories.length;
        _insrtStmt : SQLStatement = new SQLStatement();
        _insrtStmt.addEventListener( "result", addData );
        addData();
    }
    
    public function addData(event : Event = null) : void {
        _loopcounter--;
        // Set up rest of statement
        _insrtStmt.execute();
    }
    

    【讨论】:

    • 你永远不应该使用这样的循环来等待事件。
    【解决方案2】:

    也许您应该使用同步连接而不是异步连接?如果需要,您可以打开到同一个数据库的多个连接并使用适当的连接。

    【讨论】:

      【解决方案3】:

      一次执行多个命令 - 使用事务。

      来自http://www.zedia.net/2009/air-sqlite-optimization-tricks/的简单示例

      _updateStmt.sqlConnection = _conn;
      _updateStmt.text = "UPDATE main.myTable SET statusF=@STATUS  WHERE keyId=@ID";
      
      _conn.begin();//_conn is a SQLConnection, I didn't take the time to write the code for it, but this is where the magic happens
      
      for (var i:uint = 0; i < currentArray.length; i++){
        _updateStmt.parameters["@STATUS"] = currentArray[i].status;
        _updateStmt.parameters["@ID"] = currentArray[i].id;
        _updateStmt.execute();
      }
      
      _conn.commit();
      

      还可以查看 adobe flex livedocs 章节“提高数据库性能”

      【讨论】:

        【解决方案4】:

        或者您可以为每个查询创建一个新的 SQLStatement,这样您就不需要等待,并且您可以在客户端机器处理它们时尽可能快地触发插入。

        public function addData(categories:Array):void {
            status = "Adding data to table";
            var insrtStmt:SQLStatement;
        
            for(var i:int=categories.length-1; i>=0; i--) {
                insrtStmt = new SQLStatement();
                insrtStmt.sqlConnection = conn;
                insrtStmt.text = "";
                insrtStmt.text += "INSERT INTO masterlist ";
                insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
                insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) ";
                insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,";
                insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);";
                insrtStmt.parameters["@mainid"] = categories[i].mainid;
                insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate;
                insrtStmt.parameters["@tradeId"] = categories[i].tradeId;
                insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair;
                insrtStmt.parameters["@account"] = categories[i].account;
                insrtStmt.parameters["@buySell"] = categories[i].buySell;
                insrtStmt.parameters["@customer"] = categories[i].customer;
                insrtStmt.parameters["@date"] = categories[i].date;
                insrtStmt.parameters["@additionalid"] = categories[i].additionalid;
                insrtStmt.parameters["@dealType"] = categories[i].dealType;
                insrtStmt.parameters["@traderName"] = categories[i].traderName;
                insrtStmt.parameters["@genericType"] = categories[i].genericType;
                insrtStmt.parameters["@owner"] = categories[i].owner;
                insrtStmt.execute();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2012-12-16
          • 2011-07-23
          • 1970-01-01
          • 2012-09-22
          • 2011-02-06
          相关资源
          最近更新 更多