是否通过PhoneGap的Web SQL数据库按顺序执行SQL语句?

时间:2013-11-25 16:34:53

标签: javascript android cordova web-sql sequential

http://docs.phonegap.com/en/3.1.0/cordova_storage_storage.md.html#SQLTransaction上的PhoneGap Web SQL数据库文档列出了以下JavaScript代码片段:

function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS DEMO');
    tx.executeSql('CREATE TABLE IF NOT EXISTS DEMO (id unique, data)');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (1, "First row")');
    tx.executeSql('INSERT INTO DEMO (id, data) VALUES (2, "Second row")');
}

我保证上面代码片段中的四个SQL语句将按顺序执行(即,DROP TABLE命令肯定会先执行,然后是CREATE TABLE语句,然后执行,等等)?有很多关于PhoneGap Web SQL数据库API的异步性质的帖子,但我找不到有关PhoneGap Web SQL数据库API的顺序性质的任何帖子。正如您可能想象的那样,如果DROP TABLE语句没有首先完成执行,则执行CREATE TABLE语句没有任何意义。

3 个答案:

答案 0 :(得分:0)

是。这些行按顺序执行,除非你有一些条件分支...比如if-else-then。

对于上面的代码片段,它将按顺序执行..保证。

答案 1 :(得分:0)

不幸的是,它无法保证。 Websql规范并没有说请求必须按顺序执行,而IndexedDB API则执行。但大多数实现方面都要求排序,但很少有人不这样做。

正确的方法是监听请求成功回调并使用回调中的tx来保证顺序执行。

答案 2 :(得分:0)

我遇到了同样的问题。我写了一个函数,以便更容易避免回调地狱。我相信可能有类似的东西,但这里是我的。我用100,000行测试了它,没问题

function runSqlSeries(tx, sqls, parameterss, fnum, callback) {
    if (typeof sqls === 'string') {
        sqls = [sqls];
    }
    var totalNumber = sqls.length;
    var sqlIndex = fnum;
    if (parameterss && sqls.length == 1 && parameterss.length > 1) {
        //ie one sql statement run many times
        totalNumber = parameterss.length;
        sqlIndex = 0;
    }
    if (fnum >= totalNumber) {
        callback(true, "success - ran " + fnum + " sql statements");
        return;
    }
    var successFn = function() {
        astracore.runSqlSeries(tx, sqls, parameterss, fnum + 1, callback);
    }
    var errorFn = function(tx, error) {
        callback(false, "Error running function " + fnum + " " + error.message);
    }
    var parameters = [];
    if (parameterss) {
        parameters = parameterss[fnum];
    }

    tx.executeSql(sqls[sqlIndex], parameters, successFn, errorFn);
};