Javascript SQLite事务循环不递增rowsAffected

时间:2014-08-04 13:18:20

标签: javascript sql angularjs sqlite cordova

我有一个自定义的executeSql语句,我在其中传递一组查询和一组参数,以使其在单个事务中运行得更快。当它执行时,我能够看到每个executeSql的rowsAffected正确填充(我得到一些“受影响的0条记录”,还有一些“受影响的1条记录”)。

输出后我自己确认,我想跟踪总共更新了多少记录。所以我只需添加一个计数器,然后在循环完成后输出该值。但最终结果显示我每次都有0条记录受影响。

这里有什么问题?

    ExecuteQueryWhereQueryAndParamsBothArrays: function (queryArray, paramsArray, success, fail) {
        var hasError = false;
        var counter = 0;

        $rootScope.db.transaction(function (tx) {
            for (var i = 0; i < paramsArray.length; i++) {
                var query = queryArray[i];
                var params = paramsArray[i];

                tx.executeSql(query, params, function (tx, results) {
                    window.logger.logIt("results.rowsAffected: " + results.rowsAffected); // this is showing the correct results
                    counter += results.rowsAffected;
                }, function() {
                    hasError = true;
                    onError(tx, r);
                });
            }
        });

        if (hasError) {
            fail();
        } else {
            window.logger.logIt("successCounter: " + counter); // this always displays 0 (records)
            success(counter);
        }
    },

2 个答案:

答案 0 :(得分:0)

您可以尝试将以下代码添加到db.transaction的成功处理程序中,并检查计数器的值。

var counter = 0;

$rootScope.db.transaction(function (tx) {
...... // Your code.
},errorDB,succesDB)

function successDB(){
  window.logger.logIt("successCounter: " + counter);
  console.log("successCounter: " + counter); // Your counter variable should contain the total
}

function errorDB(err){
 console.log("Error processing SQL:Message:" + err.message + "CODE:" + err.code);
}

答案 1 :(得分:0)

我最终实现了像@frank建议的事务回调,但我的计数器仍为0.虽然results.rowsAffected总是准确的,但由于某种原因,计数器变量永远不能在for循环之外访问。我最终为你的角度人员实现了全局变量($ rootScope。{variablename}),并且每次都从results.rowsAffected那里增加了这个变量,并且有效。

var inc = function(incCounter) {
   $rootScope.counter = $rootScope.counter + incCounter;
};

    ExecuteQueryWhereQueryAndParamsBothArrays: function (queryArray, paramsArray, success, fail) {
        var hasError = false;
        var counter = 0;

        $rootScope.db.transaction(function (tx) {
            for (var i = 0; i < paramsArray.length; i++) {
                var query = queryArray[i];
                var params = paramsArray[i];

                tx.executeSql(query, params, function (tx, results) {
                    window.logger.logIt("results.rowsAffected: " + results.rowsAffected); // this is showing the correct results
                    inc(results.rowsAffected);
                }, function(tx, r) {
                    hasError = true;
                    onError(tx, r);
                });
            }
        }, function () {
   fail();
}, function () {
   success();
});
    },