Javascript HTML5 проблема транзакции базы данных в циклах - PullRequest
0 голосов
/ 12 марта 2010

Я поражаюсь этим и буду рад любой помощи. Мне нужно хранить в базе данных контекст (список идентификаторов строк) для другой страницы. Я открываю страницу со списком произведений искусства, и эта страница сохраняет в базе данных эти идентификаторы artowrks. Когда я нажимаю на изображение, я открываю его веб-страницу, но могу получить доступ к базе данных, чтобы узнать контекст и обратиться к следующей и предыдущей работе.

Это мой код для получения контекста:

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, удаленную, воссозданную и заполненную, но все строки заполнены идентификатором LAST artwork. работает запрос на получение идентификаторов artworks, поэтому я думаю, что это проблема транзакции, но я не могу понять, где.

спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 12 марта 2010

(Предполагая, что в цикле for вы всегда получаете result.rows.item (0) вместо индексации всех элементов, это опечатка при вставке кода в вопросе)

Возможно, вы столкнулись с «проблемой печально известной петли» с привязками переменных (описанных Робертом Найманом и Джеймсом Падолси (исходная страница исчезла, поэтому ссылка на кеш Google)).

1 голос
/ 12 марта 2010

Я до сих пор не понимаю, где мой код неправильный, но я решил с помощью:

    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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...