【问题标题】:Are SQL Statements Executed in Sequential Order via PhoneGap's Web SQL Database?SQL 语句是否通过 PhoneGap 的 Web SQL 数据库按顺序执行?
【发布时间】:2015-10-02 07:39:39
【问题描述】:

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 语句没有任何意义。

【问题讨论】:

    标签: javascript android cordova web-sql sequential


    【解决方案1】:

    很遗憾,我们无法保证。 Websql 规范并没有说请求必须按其放置的顺序执行,而 IndexedDB API 则可以。但大多数实现都尊重请求排序,但很少有人不这样做。

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

    【讨论】:

    • 那么,如果我创建的第一个表需要一个或多个索引,我需要在成功回调中创建索引吗?如果我要创建五个表,每个表都有一个针对最近创建的表声明的外键(也就是说,表 2 有一个针对表 1 的外键,表 3 有一个针对表 2 的外键,等等),我最终在表 1 的成功回调中创建表 2,在表 2 的成功回调中创建表 3,等等?
    • 我相信你不会遇到任何乱序的问题。从未听说过或看到过。
    • 只要在 SO 中搜索。报告新的科尔多瓦已经遇到问题
    • 能否请您发布新的科尔多瓦问题的 SO URL?非常感谢。
    • 如果您使用 for 循环,为了让 sql 查询按顺序执行,您需要为每个新项目创建一个新事务
    【解决方案2】:

    是的。除非您有一些条件分支,否则这些行将按顺序执行。例如 if-else-then。

    对于上面的sn-p,它会顺序执行..保证。

    【讨论】:

    • 是否有任何文件证实这一点?
    • 没有文档.. 但就我所做的而言,它始终尊重排序。
    【解决方案3】:

    我也遇到过同样的问题。我写了一个函数来更容易避免回调地狱。我敢肯定那里可能有类似的东西,但这是我的。我测试了10万行,没问题

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2013-10-20
      • 2017-05-21
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多