我在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或包含我需要插入的航班的实际事件对象。
有更好的方法吗?
答案 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]。