循环中的Javascript html5数据库事务问题

时间:2010-03-12 10:55:49

标签: javascript html5 sqlite

我很喜欢这个,我很乐意为你提供帮助。我需要在数据库中存储另一个页面的上下文(字符串ID列表)。我打开一个带有艺术品列表的页面,这个页面将这些artowrks id保存到数据库中。当我点击一件艺术品时,我打开它的网页,但我可以访问数据库以了解上下文并参考下一个和上一页的艺术作品。

这是我检索上下文的代码:

updateContext = function () {
  alert("updating context");
  try {
   mydb.transaction(
    function(transaction) {
     transaction.executeSql("select artworks.number from artworks, collections where collections.id = artworks.section_id and collections.short_name in ('cro', 'cra', 'crp', 'crm');", [], contextDataHandler, errorHandler);
    });
  } catch(e) {
   alert(e.message);
  }
}

contextDatahandler函数然后迭代结果并再次填充current_context表:

contextDataHandler = function(transaction, results) {
  try {
   mydb.transaction(
    function(transaction) {
     transaction.executeSql("drop table current_context;", [], nullDataHandler, errorHandler);
     transaction.executeSql("create table current_context(id String);", [], nullDataHandler, errorHandler);
    }
   )
  }
  catch(e) {
   alert(e.message);
  }

  var s = "";
  for (var i=0; i < results.rows.length; i++) {
   var item = results.rows.item(0);
   s += item['number'] + " ";
   mydb.transaction(
     function(tx) {
      tx.executeSql("insert into current_context(id) values (?);", [item['number']]);
     }
   )
  }
  alert(s);
}

结果是,我将current_context表删除,重新创建并填充,但所有行都填充了最后的图稿ID。检索艺术品ID的查询是有效的,所以我认为这是一个交易问题,但我无法弄清楚在哪里。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我仍然不明白我的代码错在哪里,但我通过使用:

解决了
    contextDataHandler = function(transaction, results) {
    try {
        mydb.transaction(
            function(transaction) {
                transaction.executeSql("drop table current_context;", [], nullDataHandler, errorHandler);
                transaction.executeSql("create table current_context(id String);", [], nullDataHandler, errorHandler);
                for(var i=0; i < results.rows.length; i++) {
                    var item = results.rows.item(i);
                    transaction.executeSql("insert into current_context(id) values (?);", [item['number']], nullDataHandler, errorHandler);
                }
            }
        )
    }
    catch(e) {
        alert(e.message);
    }
}

答案 1 :(得分:1)

(假设在for循环中你总是得到results.rows.item(0),而不是索引所有项目,在粘贴问题中的代码时是一个拼写错误)

您可能会遇到带有变量绑定的“臭名昭着的循环问题”(由Robert NymanJames Padolsey描述(原始页面消失,因此链接到Google缓存)。