1 votes

Les transactions sont-elles possibles avec le stockage HTML5 dans Safari ?

Au lieu de faire une boucle each loop sur un fichier JSON contenant une liste d'instructions SQL et de les transmettre une par une, est-il possible, avec le stockage côté client de Safari, d'envelopper simplement les données dans "BEGIN TRANSACTION" / "COMMIT TRANSACTION" et de les transmettre au système de base de données en un seul appel ? Faire tourner en boucle plus de 1 000 instructions prend trop de temps.

Actuellement, nous itérons 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);
                }
            );
   });
});

J'essaie de trouver 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 ?

1voto

Doug Neiner Points 34940

Tous les exemples que j'ai pu trouver dans la documentation semblent ne montrer qu'une seule SQL déclaration par executeSql commande. Je vous suggère simplement d'afficher un graphique de chargement "ajax spinner" et d'exécuter votre SQL dans une boucle. Vous pouvez garder tout cela dans la transaction, mais la boucle devrait toujours ê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 for i = devrait aider à obtenir un peu plus de vitesse de votre boucle. $.each est bonne pour moins de 1000 itérations, après quoi la méthode native de for(var = i... sera probablement plus rapide.

Nota En utilisant mon code, si l'une de vos instructions SQL génère des erreurs, la transaction entière échouera. Si ce n'est pas votre intention, vous devrez garder la boucle en dehors de la transaction.

0voto

Eli Grey Points 17553

Je n'ai jamais utilisé le stockage de base de données HTML5 (j'ai utilisé local/sessionStorage) et je suppose qu'il est possible d'exécuter une énorme chaîne d'instructions. Utilisez data.join(separator here) pour obtenir la représentation en chaîne de la data le tableau.

0voto

KenCorbettJr Points 96

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

Le processus est ainsi beaucoup plus rapide et, en cas d'erreur sur l'un de vos relevés, toute la transaction est annulée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X