São possíveis transações com o armazenamento HTML5 no Safari
-
05-07-2019 - |
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?
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.