SQL语句是通过PhoneGap'按顺序执行的吗;的Web SQL数据库

Are SQL Statements Executed in Sequential Order via PhoneGap's Web SQL Database?

本文关键字:SQL Web 数据库 顺序 执行 语句 PhoneGap      更新时间:2023-09-26

PhoneGap Web SQL数据库文档http://docs.phonegap.com/en/3.1.0/cordova_storage_storage.md.html#SQLTransaction列出了以下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 Database API的sequence性质的帖子。正如您可能想象的那样,如果DROP TABLE语句没有首先完成执行,那么执行CREATE TABLE语句就没有任何意义。

不幸的是,这并不能保证。Websql规范并没有规定请求必须按照它下的订单执行,而IndexedDB API则规定了。但大多数实现都尊重请求排序,但很少有不尊重。

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

是。除非您有一些条件分支,否则这些行将按顺序执行。。就像其他人一样。

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

我也遇到过同样的问题。我写了一个函数,使它更容易避免回调地狱。我相信可能也有类似的事情,但这是我的。我用100000条线路测试了它,没有问题

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);
};