I have a problem with using sqlite queries within back getJSON response function in my phonegap app.
I tried to apply this code and all I have is the error
INVALID_STATE_ERR: DOM Exception 11: An attempt was made to use an object that is not, or is no longer, usable.
my code is
<script>
document.addEventListener("deviceready", onDeviceReady, false);
function onDeviceReady() {
// open DB connection
var db = window.openDatabase("Database", "1.0", "PhoneGap Demo", 200000);
db.transaction(populateDB, errorCB, successCB);
}
function populateDB(tx) {
tx.executeSql('DROP TABLE IF EXISTS buses');
tx.executeSql('CREATE TABLE IF NOT EXISTS buses (bus_id INTEGER PRIMARY KEY,bus_no TEXT, bus_time TEXT,from_loc TEXT,to_loc TEXT,route TEXT)');
$.getJSON('http://myegy.me/maryam/asem/api.php?table=trip', function(data) {
$.each(data, function(key, val) {
tx.executeSql('INSERT INTO buses (bus_no,from_loc,to_loc,route) VALUES ("'+val['trip_number']+'","'+val['from_id']+'","'+val['to_id']+'","'+val['stop_station']+'")');
});
});
tx.executeSql('DROP TABLE IF EXISTS bus_stations');
tx.executeSql('CREATE TABLE IF NOT EXISTS bus_stations (id INTEGER PRIMARY KEY,station_name TEXT, station_description TEXT,station_lat TEXT,station_long TEXT)');
$.getJSON('http://myegy.me/maryam/asem/api.php?table=station', function(data) {
$.each(data, function(key, val) {
tx.executeSql('INSERT INTO bus_stations (station_name,station_lat,station_long) VALUES ("'+val['station_name']+'","'+val['latitude']+'","'+val['longitude']+'")');
});
});
}
</script>
the problem in these two lines
tx.executeSql('INSERT INTO buses (bus_no,from_loc,to_loc,route) VALUES ("'+val['trip_number']+'","'+val['from_id']+'","'+val['to_id']+'","'+val['stop_station']+'")');
and
tx.executeSql('INSERT INTO bus_stations (station_name,station_lat,station_long) VALUES ("'+val['station_name']+'","'+val['latitude']+'","'+val['longitude']+'")');
You have to move the $.getJSON statements to the successCB function, and I also would suggest to pass the json data as a parameter to a function that processes the data as a db.transaction.
function successCB() {
$.getJSON('http://myegy.me/maryam/asem/api.php?table=trip', function (data) {
setBuses(data);
}
}
function setBuses(data) {
this.db.transaction(
function (tx) {
var l = data.length;
var sql = 'INSERT INTO buses (bus_no,from_loc,to_loc,route) VALUES (?,?,?,?)';
var b;
for (var i = 0; i < l; i++) {
b = data[i];
var params = [b.trip_number,b.from_id,b.to_id,b.stop_station];
tx.executeSql(sql, params);
}
},
errorCB,
function () {}
);
}
I suggest you read the article of June 2012 of Appliness (http://www.appliness.com/download/), called 'Offline Data Synchronization' written by Christophe Coenraets.