Frage

Anstatt eine jeder Schleife in einer JSON -Datei mit einer Liste von SQL -Statements zu erstellen und sie einzeln zu übergeben, ist es mit Safari Client Side -Speicher möglich, die Daten einfach in die "Transaktion" mit der Transaktion "zu beginnen" / "Commit -Transaktion" einzuwickeln und diese zu übergeben zum Datenbanksystem in einem einzigen Anruf? Die Looping von über 1.000 Aussagen braucht zu viel Zeit.

Derzeit iteriert jeweils eine Transaktion:

$j.getJSON("update1.json",
  function(data){
    $j.each(data, function(i,item){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
                }
            );
   });
});

Versuchen Sie herauszufinden, wie man nur einen Anruf tätigt:

$j.getJSON("update1.json",
  function(data){
            testDB.transaction(
                function (transaction) {
                    transaction.executeSql(data, [], nullDataHandler, errorHandler);
                }
            );
});

Hat jemand das schon versucht und erfolgreich?

War es hilfreich?

Lösung

Jedes Beispiel, das ich in der Dokumentation finden konnte SQL Erklärung per executeSql Befehl. Ich würde nur empfehlen, einen "Ajax Spinner" -Lader -Ladegrafik zu zeigen und Ihre SQL in einer Schleife auszuführen. Sie können alles in der Transaktion behalten, aber die Schleife müsste immer noch da sein:

$j.getJSON("update1.json",
    function(data){
       testDB.transaction(
           function (transaction) {
               for(var i = 0; i < data.length; i++){
                   transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
               }
           }
       );
    }
);

Verschieben der Schleife innerhalb der Transaktion und verwenden Sie die for i = Sollte Ihnen helfen, etwas mehr Geschwindigkeit aus Ihrer Schleife herauszuholen. $.each ist gut für weniger als 1000 Iterationen, danach der Eingeborene for(var = i... wird wahrscheinlich schneller sein.

Notiz Wenn Sie meinen Code verwenden, fehlschlägt die gesamte Transaktion, wenn eine Ihrer SQL -Anweisungen Fehler wirft, fehl. Wenn dies nicht Ihre Absicht ist, müssen Sie die Schleife außerhalb der Transaktion behalten.

Andere Tipps

Ich habe mich noch nie mit dem Speicher der HTML5 -Datenbank (aber mit lokal/sessionStorage) versehen und ich würde davon ausgehen, dass es möglich ist, eine riesige Reihe von Anweisungen auszuführen. Verwenden data.join(separator here) Um die String -Darstellung der zu erhalten data Array.

Ja, es ist möglich, eine ganze Gruppe von Aussagen innerhalb einer einzelnen Transaktion mit WebQL zu verarbeiten. Sie müssen eigentlich nicht einmal Beginn oder Commit verwenden. Dies wird für Sie automatisch gepflegt, solange Sie alle Ihre ExecutesQL -Anrufe aus derselben Transaktion tätigen. Solange Sie dies tun, wird jede Aussage in die Transaktion einbezogen.

Dies macht den Prozess viel schneller und macht es auch so, dass eine Ihrer Aussagen einen Fehler hat, der die gesamte Transaktion zurückrollt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top