1

我正在开发一个使用 HTML5 和 Web 数据库存储的应用程序。

我想在表中插入一行并返回使用以下方法创建的新 ID(表的主键):

function insertIntoTable(title, text, sketchFileName, categoryId)
{
    var db = window.openDatabase('xxx', '1.0', 'xxx database', 5*1024*1024);
    var returnedId = -1;
    db.transaction(
        function (tx) {
            if (sketchFileName == '')
            {
                tx.executeSql('INSERT INTO TableXXX (title, content, created, categoryID) VALUES (?, ?, ?, ?)', 
                            [title, text, Date.now(), categoryId], 
                            function (transaction, resultSet) {
                                if (resultSet.rowsAffected) {
                                    returnedId = resultSet.insertId;
                                }
                            }, handleSQLError);
            }
        }, handleSQLError);
    );

    return returnedId;
}

但我总是得到-1。我使用 Safari 开发模式在表中看到新行。

有什么建议吗?

4

1 回答 1

1

如果将returnedId 的声明移到函数外部,然后调用该函数两次,您将看到返回值是第一个插入的id,因此正在设置它。看起来,因为数据库是异步的,所以在函数返回后设置 id,这是有道理的。

根据 W3C 规范,应该有一个 openDatabaseSync 可以用来代替 openDatabase 但我无法让它在 Safari (5.0.1) 中工作。

显然,我不知道你的代码在你发布的代码片段之外是什么样子,但希望你能够重构它,这样你就不需要返回值,而是可以在回调中管理返回的 id .

于 2011-08-30T15:19:06.717 回答