使用SQLite与Blackberry Webworks插入相关数据

时间:2011-02-23 21:40:29

标签: javascript sqlite html5 blackberry

我在BB5下运行Blackberry Webworks webapp,使用SQLite数据库在本地存储数据。该数据库有两个表,即事件和航班,其中一个事件可以有许多与之相关的航班。

我发现很难弄清楚如何从数据数组中填充两个表。我的麻烦在于将外键插入到flight表中,这是由于BB的SQLite实现的异步方式。

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)
}

因此,无论我在哪里尝试执行航班的插入查询,我都错过了一段数据。插入ID或包含我需要插入的航班的实际事件对象。

有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

有很多方法可以解决此问题。一个简单的方法:

db.transaction(function(tx) {
     var eventIds = [];
     for(var i = 0; i < eventsArray.length; i++) {
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 } });

在回调中将id存储为eventsArray [i] .id = result.indsertId;即直接在当前事件对象上。但这取决于你的业务逻辑的细节,也许是event.id已经意味着别的东西。 此外,为事件使用局部变量是有意义的,因此每次访问其成员时都不会重新计算eventsArray [i]。