JSSQL中的循环内部的WebSQL事务

时间:2015-08-19 20:05:25

标签: javascript sqlite transactions web-sql

我目前正在尝试将数据从数组插入到WebSQL数据库中,并得到一些奇怪的结果。我认为这是因为它是异步的。

问题是我试图使用for循环中的事务插入数据,该循环也嵌套在另一个事务中。代码几乎可以工作,但只完成循环的最终事务。

                    for (i = 0; i < array.gArr.length; i++)
                    {
                        var group_id = array.gArr[i].group_id;
                        var title = array.gArr[i].title;
                        var description = array.gArr[i].description;
                        var photo = array.gArr[i].default_photo;


                        tx_num = "tx" + i;


                        db.transaction(function (tx_num) {     
                            tx_num.executeSql("INSERT OR IGNORE INTO my_groups(group_id, title, description, photo_url) VALUES (?,?,?,?)", [group_id, title, description, photo]);
                        });


                    }

tx_num存在的原因是试图查看它是否是由于具有相同的tx名称。

我也尝试过使用INSERT INTO,这导致了问题并且结果是一样的。

仅供参考,表格是使用以下方式创建的:

db.transaction(function (tx) {

    tx.executeSql('CREATE TABLE IF NOT EXISTS my_groups(group_id UNIQUE, title, description, photo_url)');

});

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。

似乎每次循环完成时都会覆盖事务,因此它只完成最终事务。要确保所有这些都运行,您需要将循环包含在db.transaction中。通过执行此操作,所有事务都在运行db.transaction时运行。这完全归功于异步性质。

以下是未来参考的代码:

db.transaction(function (tx1) {     
    for (i = 0; i < array.gArr.length; i++)
    {
        var group_id = array.gArr[i].group_id;
        var title = array.gArr[i].title;
        var description = array.gArr[i].description;
        var photo = array.gArr[i].default_photo;

        tx1.executeSql("INSERT OR REPLACE INTO my_groups(group_id, title, description, photo_url) VALUES (?,?,?,?)", [group_id, title, description, photo]);

    }

});