Pergunta

Em vez de fazer um loop em um arquivo JSON contendo uma lista de instruções SQL e passando uma de cada vez, é possível com o armazenamento lateral do cliente Safari para simplesmente envolver os dados em "Begin Transaction" / "Committ Transaction" e passar isso Para o sistema de banco de dados em uma única chamada? O loop mais de 1.000 declarações leva muito tempo.

Atualmente iterando uma transação de cada vez:

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

Tentando descobrir como fazer apenas uma chamada:

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

Alguém já tentou isso e conseguiu?

Foi útil?

Solução

Todo exemplo que pude encontrar na documentação parece mostrar apenas um SQL declaração por executeSql comando. Eu sugeriria mostrar um gráfico de carregamento de "Ajax Spinner" e executar seu SQL em um loop. Você pode manter tudo dentro da transação, mas o loop ainda precisaria estar 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);
               }
           }
       );
    }
);

Movendo o loop dentro da transação e usando o for i = deve ajudar a obter um pouco mais de velocidade do seu loop. $.each é bom para menos de 1000 iterações, depois disso o nativo for(var = i... provavelmente será mais rápido.

Observação Usando meu código, se alguma das suas instruções SQL lançar erros, toda a transação falhará. Se essa não for sua intenção, você precisará manter o loop fora da transação.

Outras dicas

Eu nunca mexi com o armazenamento de banco de dados HTML5 (porém, tenho com o local/sessionStorage) e presumiria que é possível executar uma grande série de instruções. Usar data.join(separator here) Para obter a representação da string do data variedade.

Sim, é possível processar um grupo inteiro de declarações em uma única transação com o WebSQL. Na verdade, você nem precisa usar ou comprometer, isso é resolvido automaticamente, desde que você faça todas as suas chamadas ExecutesQL da mesma transação. Contanto que você faça isso, todas as afirmações são incluídas na transação.

Isso torna o processo muito mais rápido e também o torna para que, quando uma de suas instruções tiver um erro, ele rejeita toda a transação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top