当用户在应用程序上时,我的混合应用程序正在将数据从服务器推送到cordova应用程序。从我的服务器,我的JSON中有2000个数据。我成功地将2000个数据插入到我的SQLite数据库中。但是,我意识到该程序插入了与服务器中最后一个数据相同的2000个数据。以下是我的代码。
$http.get("http://131.4.44.69/php3/fetchSAPInfo.php?key=" + lastSAPOID).success(function (data){
alert(lastSAPOID);
if(data == 1){
alert("data is up to date");
}else{
alert("data is updating......");
var i;
for(i=0; i<data.length; i++){
var SAP_OID = data[i].SAP_OID;
var SAP_Asset = parseInt(data[i].SAP_Asset);
var SAP_Description = data[i].SAP_Description;
db.transaction(function(tx) {
alert(SAP_Asset);
tx.executeSql('INSERT INTO SAPInfo VALUES (?,?,?)', [SAP_OID, SAP_Asset , SAP_Description]);
}, function(error) {
console.log(error);
}, function() {
alert("insert successfully");
})
}
}
}).then (function (response){
alert("done and finished");
});
我意识到代码,然后转到函数首先只运行db.transaction()函数。因此,程序不会相应地获取JSON数据。我该如何解决这个问题?
答案 0 :(得分:1)
我花了一整天的时间来弄清楚问题是什么。我的for循环必须放在db.transaction()函数中。这是异步编程的问题。以下是我的答案。
$http.get("http://131.4.44.69/php3/fetchSAPInfo.php?key=" + res).success(function (response){
if(response == 1){
console.log("data is up to date.......");
}else{
console.log("data is updating.........");
db.transaction(function(tx) {
var i;
for(i=0; i<response.length; i++){
var SAP_OID = response[i].SAP_OID;
var SAP_Asset = parseInt(response[i].SAP_Asset);
var SAP_Description = response[i].SAP_Description;
tx.executeSql('INSERT INTO SAPInfo VALUES (?,?,?)', [SAP_OID, SAP_Asset , SAP_Description]);
}
}, function(error) {
console.log(error);
}, function() {
console.log("insert successfully");
})
}
}).then (function (response){
console.log("done and finished");
});