我正在开发一个将使用 sqlite 数据库的 phonegap 应用程序。该数据库的唯一更新将涉及其内容,而不是其方案。
保持本地 sqlite 数据库更新的方法是:
有一个带有两列表的远程数据库:“id”和“sql_sentence”。它存储要在本地执行的 sql_sentences 集,以便更新本地 sqlite db。
在本地,我有一个 var 'local_max_id' 保留本地执行的最后一个 sql_sentence 的 id。应用程序第一次运行时,其值为 0。
每次应用程序启动时,它都会将“local_max_id”的值与远程数据库的“id”列中的最大值进行比较。
如果值匹配,则本地数据库是最新的。否则,我必须检索 id 大于“local_max_id”的 sql_sentences 集,执行它并将“local_max_id”更新为最后收到的行 id。
执行此操作的代码(有一些西班牙语消息,但我已尝试用英语提供必要的信息):
var min_id;
var local_max_id=0;
var sentencia_sql = "";
function initDB(){
//Just to make sure it requests the database info. Out when in production
window.localStorage.setItem("local_max_id", 0);
// Used to see which has been the last sql_sentence id executed locally
local_max_id = window.localStorage.getItem("local_max_id");
//Call to retrieve the highest id in remote database
$.post("http://mytests.es/phonegap-db/get-db.php", {exec:"max_id"}, treat_max_id, "json");
}
//Method that decides what to do depending on returned remote_max_id value and local_max_id.
function treat_max_id(remote_max_id){
if(remote_max_id > local_max_id){
$.post("http://mytests.es/phonegap-db/get-db.php", {exec:"get_sentencias", "min_id":local_max_id},
function(res) {
if(res){
for(j=0;j<res.length;j++){
sentencia_sql = res[j].sentencia;
alert(sentencia_sql);
//The problem is here. While the alert shows the proper sql_sentence of each iteration, this variable (sentencia_sql) only has the last returned value inside transaction function, but is executed N times (being N the amount of returned sql_sentences)
transaction(
function(tx){
console.log(sentencia_sql);
tx.executeSql(sentencia_sql);
},
errorDB,
succesDB2
);
}
window.localStorage.setItem("local_max_id", remote_max_id);
}
else{
console.error("No se ha recuperado resultado de get-db.php/get_sentencias");
}
},"json"
);
}
}
用要执行的 N 个 sql 语句处理结果的循环的行为方式让我难以理解。即使应该在本地执行 sql 语句的方法 'transaction' 位于循环内并且每个接收到的行执行一次,但变量 'sentencia_sql' 始终具有相同的值,即最后接收到的 sql 语句。
正常吗?我应该使用任何指令来控制这种异步行为吗?