Pregunta

En lugar de hacer cada ciclo en un archivo JSON que contiene una lista de declaraciones SQL y pasarlas de una en una, es posible con el almacenamiento del lado del cliente Safari simplemente envolver los datos en "COMENZAR TRANSACCIÓN" / " COMICIÓN DE TRANSACCIÓN " y pasar eso al sistema de base de datos en una sola llamada? Hacer bucles de más de 1.000 declaraciones lleva demasiado tiempo.

Actualmente iterando una transacción a la vez:

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

Intentando averiguar cómo hacer una sola llamada:

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

¿Alguien ha intentado esto y lo ha logrado?

¿Fue útil?

Solución

Todos los ejemplos que pude encontrar en la documentación parecen mostrar solo una instrucción SQL por cada executeSql . Solo sugeriría mostrar un " ajax spinner " Cargando gráfico y ejecuta tu SQL en un bucle. Puede mantenerlo todo dentro de la transacción, pero el ciclo aún debería estar allí:

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

Mover el bucle dentro de la transacción y usar el para i = debería ayudar a obtener un poco más de velocidad fuera de tu bucle. $ .each es válido para menos de 1000 iteraciones, después de eso, el nativo para (var = i ... probablemente será más rápido.

Nota Al usar mi código, si alguna de sus declaraciones SQL arroja errores, la transacción completa fallará. Si esa no es su intención, deberá mantener el ciclo fuera de la transacción.

Otros consejos

Nunca me he metido con el almacenamiento de la base de datos HTML5 (aunque tengo con local / sessionStorage) y supongo que es posible ejecutar una gran cadena de declaraciones. Utilice data.join( separator here ) para obtener la representación de cadena de los datos de matriz.

Sí, es posible procesar un grupo completo de declaraciones dentro de una sola transacción con webSQL. En realidad, ni siquiera necesita usar BEGIN o COMMIT, esto se encargará de usted automáticamente siempre que realice todas sus llamadas executeSql desde la misma transacción. Siempre que lo haga, todas las declaraciones se incluirán en la transacción.

Esto hace que el proceso sea mucho más rápido y también hace que cuando uno de sus estados de cuenta tenga un error, revierta toda la transacción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top