2

これは私を夢中にさせています。

デバイスがオフラインのときにローカル ストレージ Web DB を使用してこれらのメッセージを保存し、インターネット接続があるときにこれらのメッセージを送信するメッセージ キューがあります。メッセージを送信した後、テーブルから削除してください。

メッセージを送信するとき、どの行を削除する必要があるかを参照できるように、MessageIDs という配列を保持します。

MessageID の長さをループして各 ID を取得し、DELETE トランザクションを実行します。私の alert() は正しい値を取得しますが、トランザクションが実行されると、値は未定義です。既知の「ID」をトランザクションにハードコーディングしてみましたが、うまくいきました。何かご意見は?

 var MessageIDs = new Array();

//In the block of code not shown I populate MessageIDs and send out messages

for(var j=0; j < MessageIDs.length; j++)
{
  alert(MessageIDs[j]); //Pulls the right value
  site.data.database.transaction(  
            function (transaction) {  
                //[MessageIDs[j]] has a value of undefined and thus doesn't get deleted but the transaction doesn't technically fail either
                transaction.executeSql("DELETE FROM Messages WHERE id = ?;", [MessageIDs[j]],  
                    site.contact.removeQueuedMessagesSuccess, site.contact.removeQueuedMessagesError);  
            }  
        ); 
}
4

1 に答える 1

1

申し訳ありませんが、これをコメントとして入れることはできません。したがって、ここで回答として、DCoder の回答を拡張します。ループをトランザクション内に配置することもできます。そうすれば、それも機能します。ただし、彼のソリューションはよりクリーンです。

編集:この追加が重要ではない理由を説明する必要があるかもしれません:明らかに、そのような方法でクエリを常に組み合わせることができるとは限りません。したがって、トランザクションのネストを開始する前に、クエリのループを 1 つのトランザクション内に配置してください。

于 2012-10-13T12:24:25.793 に答える