Возможны ли транзакции с помощью хранилища HTML5 в Safari?

StackOverflow https://stackoverflow.com/questions/1800213

Вопрос

Вместо того, чтобы выполнять каждый цикл в файле JSON, содержащем список операторов SQL, и передавать их по одному, возможно ли с помощью клиентского хранилища Safari просто обернуть данные в «BEGIN TRANSACTION» / «COMMIT TRANSACTION» и передать это к системе базы данных за один вызов?Зацикливание более 1000 операторов занимает слишком много времени.

В настоящее время выполняется одна транзакция за раз:

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

Пытаюсь понять, как сделать всего один звонок:

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

Кто-нибудь уже пробовал это и добился успеха?

Это было полезно?

Решение

Каждый пример, который я смог найти в документации, показывает только одну инструкцию SQL на команду executeSql . Я бы просто предложил показать «вращатель ajax» загрузка графики и выполнение вашего SQL в цикле. Вы можете сохранить все это внутри транзакции, но цикл все равно должен быть там:

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

Перемещение цикла внутри транзакции и использование для i = должно помочь немного ускорить ваш цикл. $. each подходит менее чем для 1000 итераций, после этого нативный для (var = i ... , вероятно, будет быстрее.

Примечание . Используя мой код, если какой-либо из ваших операторов SQL выдает ошибки, вся транзакция не будет выполнена. Если это не ваше намерение, вам нужно будет оставить цикл вне транзакции.

Другие советы

Я никогда не связывался с хранилищем базы данных HTML5 (хотя и с local/sessionStorage), и я предполагаю, что можно запустить одну огромную строку операторов.Использовать data.join(separator here) чтобы получить строковое представление data множество.

Да, с помощью WebSQL можно обрабатывать целую группу операторов в одной транзакции. На самом деле вам даже не нужно использовать BEGIN или COMMIT, об этом позаботятся автоматически, если вы выполняете все вызовы executeSql из одной транзакции. Пока вы делаете это, каждый оператор включается в транзакцию.

Это значительно ускоряет процесс, а также приводит к тому, что, когда в одном из ваших операторов выдается ошибка, выполняется откат всей транзакции.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top