Question

Plutôt que d'effectuer une boucle sur un fichier JSON contenant une liste d'instructions SQL et de les transmettre une par une, il est possible avec le stockage côté client Safari de simplement envelopper les données dans "BEGIN TRANSACTION". / "COMMIT TRANSACTION" et passer cela au système de base de données en un seul appel? La mise en boucle de plus de 1 000 déclarations prend trop de temps.

itérant actuellement une transaction à la fois:

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

Essayez de comprendre comment passer un seul appel:

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

Quelqu'un a-t-il déjà essayé et réussi?

Était-ce utile?

La solution

Tous les exemples que je trouve dans la documentation semblent ne contenir qu'une seule instruction SQL par commande executeSql . Je suggérerais simplement de montrer un " ajax spinner " chargement du graphique et exécution de votre SQL dans une boucle. Vous pouvez tout garder dans la transaction, mais la boucle doit tout de même être 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);
               }
           }
       );
    }
);

Déplacer la boucle à l'intérieur de la transaction et utiliser le pour i = devrait vous aider à tirer un peu plus de vitesse de votre boucle. $. each est valable pour moins de 1000 itérations, après quoi le natif de (var = i ... sera probablement plus rapide.

Remarque À l'aide de mon code, si l'une de vos instructions SQL génère des erreurs, l'ensemble de la transaction échouera. Si ce n’est pas votre intention, vous devrez garder la boucle en dehors de la transaction.

Autres conseils

Je n'ai jamais eu affaire au stockage de base de données HTML5 (avec local / sessionStorage cependant) et je suppose qu'il est possible d'exécuter une énorme chaîne d'instructions. Utilisez data.join ( séparateur ici ) pour obtenir la représentation sous forme de chaîne du data tableau.

Oui, il est possible de traiter tout un groupe d'instructions dans une transaction unique avec webSQL. En fait, vous n'avez même pas besoin d'utiliser BEGIN ou COMMIT, ceci est automatiquement pris en charge pour vous tant que vous passez tous vos appels executeSql à partir de la même transaction. Tant que vous faites cela, chaque instruction est incluse dans la transaction.

Cela accélère considérablement le processus et fait en sorte que, si une de vos déclarations contient une erreur, elle annule la totalité de la transaction.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top