2

sqliteデータベースを使用するphonegapアプリを開発しています。このデータベースの唯一の更新には、そのスキームではなく、その内容が含まれます。

ローカルのsqliteデータベースを最新の状態に保つためのアプローチは次のとおりです。

  1. 'id'と'sql_sentence'の2つの列を持つテーブルを持つリモートデータベースがあります。ローカルで実行されるsql_sentencesのセットが格納されるため、ローカルのsqliteデータベースが更新されます。

  2. ローカルには、ローカルで実行された最後のsql_sentenceのIDを保持する変数'local_max_id'があります。アプリを初めて実行するとき、その値は0です。

  3. アプリが起動するたびに、「local_max_id」の値をリモートDBの「id」列の最大値と比較します。

  4. 値が一致する場合、ローカルDBは最新です。それ以外の場合は、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'はループ内にあり、受信した行ごとに1回実行されますが、変数'sentencia_sql'は常に同じ値(最後に受信したSQLセンテンス)を持ちます。

正常ですか?この非同期動作を制御するために命令を使用する必要がありますか?

4

1 に答える 1

0

非同期JavaScriptにはある程度の慣れが必要です。コードは記述された順序で実行されず、ループのすべての反復が同じスコープを共有します。

ループを使用してsqliteデータベースに行を追加する(Phonegap)

于 2012-12-08T13:36:17.183 に答える