Вставка связанных данных с использованием SQLite с Blackberry Webworks - PullRequest
0 голосов
/ 24 февраля 2011

У меня есть веб-приложение Blackberry Webworks, работающее под BB5, которое хранит данные локально, используя базу данных SQLite.В базе данных есть две таблицы: событие и полет, где с одним событием может быть связано много рейсов.

Мне трудно понять, как заполнить обе таблицы из массива данных.Моя проблема в том, чтобы заставить внешний ключ вставлять в таблицу рейсов из-за асинхронного способа, которым работает реализация SQLite в BB.

db.transaction(function(tx) {
     for(var i = 0; i < eventsArray.length; i++) {
          var insertId = 0;
          tx.executeSql("INSERT INTO event(id,eventName,venueName) VALUES (?,?,?)",
                            [null,
                             eventsArray[i].eventName,
                             eventsArray[i].venueName],
                             function(tx,result) { //success callback
                                 insertId = result.insertId;
                                 //If I try inserting flights here, eventsArray[i] always returns
                                 //the last item in the array, the for loop has kept running
                             }
           );
           //If I try inserting here, I don't have the insertId
           //to populate the foreign key (still set to 0 as the
           //callbacks haven't fired yet)
}

Так что, кажется, везде, где я пытаюсь выполнить запрос на вставку для рейсов,Я скучаю по части данных.Либо идентификатор вставки, либо фактический объект события, содержащий полеты, которые мне нужно вставить.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 04 апреля 2011

Есть много способов решить эту проблему.Простой подход: db.transaction(function(tx) { var eventIds = []; for(var i = 0; i < eventsArray.length; i++) {<br> tx.executeSql("INSERT INTO event(id,eventName,venueName) VALUES (?,?,?)", [null, eventsArray[i].eventName, eventsArray[i].venueName], function(tx,result) { //success callback eventIds[i] = result.insertId; } ); } //for //now, for every event eventsArray[i] you have eventId as eventIds[i] for(i = 0; i < flightsArray.length; i++) { //use eventIds[i] here } });

Было бы более целесообразно хранить идентификатор в обратном вызове как eventsArray [i] .id = result.indsertId;т.е. непосредственно на текущем объекте события.Но это зависит от деталей вашей бизнес-логики, возможно, event.id уже означает что-то другое.Кроме того, имеет смысл использовать локальную переменную для события, чтобы вы не пересчитывали eventsArray [i] каждый раз, когда обращаетесь к его членам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...