Domanda

Invece di eseguire ogni ciclo su un file JSON contenente un elenco di istruzioni SQL e passandole una alla volta, è possibile con l'archiviazione lato client Safari semplicemente racchiudere i dati in " BEGIN TRANSACTION " / " COMMIT TRANSACTION " e passarlo al sistema di database in una sola chiamata? Il ciclo di oltre 1.000 istruzioni richiede troppo tempo.

Attualmente ripetendo una transazione alla volta:

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

Prova di capire come effettuare una sola chiamata:

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

Qualcuno ci ha ancora provato e ci è riuscito?

È stato utile?

Soluzione

Ogni esempio che ho trovato nella documentazione sembra mostrare solo un'istruzione SQL per comando executeSql . Vorrei solo suggerire di mostrare un "ajax spinner" caricamento grafico ed esecuzione di SQL in un ciclo. Puoi tenere tutto all'interno della transazione, ma il loop dovrebbe comunque essere lì:

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

Spostare il ciclo all'interno della transazione e usare per i = dovrebbe aiutarti a ottenere un po 'più di velocità dal tuo ciclo. $ .each è valido per meno di 1000 iterazioni, dopodiché il nativo per (var = i ... sarà probabilmente più veloce.

Nota Utilizzando il mio codice, se una delle tue istruzioni SQL genera errori, l'intera transazione fallirà. Se questa non è la tua intenzione, dovrai mantenere il ciclo al di fuori della transazione.

Altri suggerimenti

Non ho mai incasinato l'archiviazione del database HTML5 (ma con local / sessionStorage) e suppongo che sia possibile eseguire un'enorme stringa di istruzioni. Usa data.join( separatore qui ) per ottenere la rappresentazione in stringa dei dati array.

Sì, è possibile elaborare un intero gruppo di istruzioni all'interno di una singola transazione con webSQL. In realtà non hai nemmeno bisogno di usare BEGIN o COMMIT, questo è gestito automaticamente per te fintanto che effettui tutte le tue chiamate di executeSql dalla stessa transazione. Finché lo fai, ogni dichiarazione viene inclusa nella transazione.

Questo rende il processo molto più veloce e lo rende anche tale che quando una delle tue dichiarazioni ha un errore, ripristina l'intera transazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top