我正在使用HTML5和网络数据库存储开发应用程序。
我想在表中插入一行并返回使用以下内容创建的新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开发模式在表中看到了新行。
有什么建议吗?
答案 0 :(得分:1)
如果将returnedId的声明移到函数外部然后调用该函数两次,您将看到返回的值是第一个插入的id,因此正在设置它。看起来,因为数据库是异步的,所以在函数返回后设置id,这是有道理的。
根据W3C规范,应该有一个openDatabaseSync可以用来代替openDatabase,但我无法在Safari(5.0.1)中使用它。
显然,我不知道您发布的代码段之外的代码是什么样的,但希望您能够重构它,这样您就不需要返回值,而是可以管理返回的id在回调中。