2

当我尝试处理一个时,它失败了:

未捕获的错误:INVALID_STATE_ERR:文件中的 DOM 异常 11:///android_asset/www/library/custom.js:39

但是当我尝试第二个过程时,它就好了。

var db = window.openDatabase("Pemberton", "1.0", "Pemberton Stay App", 200000);
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
    db.transaction(populateDB, errorCB, successCB);
}

过程1:

function populateDB(tx) {
    tx.executeSql('DROP TABLE IF EXISTS eat');
    tx.executeSql('CREATE TABLE IF NOT EXISTS eat (id, image, title)');
    var queries = new Array();
    $.getJSON( serviceURL + 'category-list.php?cid=1&p=?', function(data) {
        var results = data.items;
        $.each(results,function(index,record){
            if( record.id != undefined )
                tx.executeSql('INSERT INTO eat (id, image, title) VALUES ("'+record.id+'","'+record.image+'","'+record.title+'")');
        });

    });    
}

过程2:

function populateDB(tx) 
{
    tx.executeSql('INSERT INTO eat (id, image, title) VALUES (2,"one.jkd","OneFirst")');
    tx.executeSql('INSERT INTO eat (id, image, title) VALUES (2, "two.png","Second")');
    tx.executeSql('INSERT INTO eat (id, image, title) VALUES (3, "thr.png","Third")');
    tx.executeSql('INSERT INTO eat (id, image, title) VALUES (4, "fou.png","Fourth")');
    tx.executeSql('INSERT INTO eat (id, image, title) VALUES (5, "fiv.png","Fifth")');
}
4

3 回答 3

2

我使用 .ajax() 并通过添加async:false解决了这个问题;

$.ajax({ type: "POST", url: myurl, dataType: "xml", async : false, success: function (xml) {

                    $(xml).find('articles').each(
                        function ()
                        {

                            tx.executeSql('INSERT INTO ORDERS (id, client_ID, status) VALUES ('+ idord2 +', 4, "done" )');
                        });         
                    }
                });
于 2012-09-21T19:02:55.963 回答
2

尽管其他答案之一有效,但我想对其进行扩展,因为我遇到了同样的问题,并且该答案没有说明为什么它不像 OP 那样工作。

当您在 Web SQL 中创建事务时,事务处理只有在事务中有任何语句排队时才会保持活动状态。一旦事务中的语句管道干涸,引擎就会关闭(提交)事务。这个想法是当function(tx) { ... }回调运行时,

  1. 它执行它需要的所有语句。executeSql是异步的,因此即使语句尚未执行,它也会立即返回。
  2. 它将控制权返回给 Web SQL 引擎。

此时引擎注意到有语句排队并在关闭事务之前运行它们直到完成。在您的情况下,会发生以下情况:

  1. 您调用executeSql两次来排队两个语句。
  2. 你通过ajax请求一些东西。
  3. 你回来

引擎运行它已排队的两个语句。ajax 请求也在异步运行,但它必须访问速度较慢的网络,因此它可能尚未完成。此时,语句队列为空,Web SQL 引擎决定是时候提交和关闭事务了!它无法知道稍后会有另一个声明!当 ajax 调用返回并尝试执行时INSERT INTO locations,为时已晚,事务已经关闭。

主要有两种解决方案:

  • 在回调中的一个事务中执行所有操作(the DROP、theCREATE和所有s)。INSERTgetJSON

    这是我推荐的。我认为很有可能等到 ajax 请求完成后再创建表与您的应用程序要求兼容。

  • 如另一个答案中所述,同步执行 ajax 请求。

    我不建议这样做。JavaScript 中的异步编程是一件好事

顺便说一句,在搜索这个问题时,我发现这个问题的答案基本相同,所以我写了相同的答案,但那里有更多的细节。我知道在 SO 上不鼓励复制和粘贴答案,但我想确保将来咨询任一问题的用户都能阅读答案。我制作了这个社区维基。我希望没关系。

于 2014-11-27T10:28:24.277 回答
1

db 操作必须在 deviceready 事件后完成,请参阅完整示例http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html#SQLTransaction

....
// Wait for PhoneGap to load
    //
    document.addEventListener("deviceready", onDeviceReady, false);

    // PhoneGap is ready
    //
    function onDeviceReady() {
        var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
        db.transaction(populateDB, errorCB, successCB);
    }
....
于 2012-09-04T23:02:20.990 回答