Есть ли ограничение на количество операторов executeSql, которые вы можете запустить в одной транзакции, используя phonegap на Android?

Есть ли ограничение на количество операторов executeSql, которые вы можете запустить в одной транзакции, используя phonegap на Android? Я начинаю транзакцию (db.transaction(...)) и затем перебираю около 4000 продуктов. Для каждого продукта я выполняю оператор executeSql INSERT (tx.executeSql(...)). Кажется, что все операторы executeSql INSERT обрабатываются нормально, но как только он достигает последнего, я получаю сообщение об ошибке «Недостаточно памяти». В ошибке также говорится, что «пользователю не удалось разрешить выделение дополнительной памяти». Он отлично работает на iOS и в Ripple, но Android не работает!


person torgy    schedule 17.04.2013    source источник


Ответы (1)


Есть ли ограничение на количество операторов executeSql, которые вы можете запустить в одной транзакции, используя phonegap на Android?

Насколько я знаю, нет ограничений на конкретное использование sqlite, phonegap и android.

Я также попытался вставить транзакции в цикле, в каждую итерацию вставлялось около 8 МБ данных.

Я также столкнулся с тем, что у Android закончилась память.

В моем случае решение состояло в том, чтобы обернуть метод executeSql() в анонимную самовыполняющуюся функцию.

Исходный код, который вызывал переполнение памяти только на Android:

db.transaction(function(){
  customers.forEach(function(customer){
    tx.executeSql(...);
  });
});

Решение, которое позволило правильно собрать мусор:

db.transaction(function(){
  customers.forEach(function(customer){
    (function(){ tx.executeSql(...); })(); // <- Solution
  });
});

Я должен быть честным, в этот момент я не совсем понимаю, почему. Я предполагаю, что анонимная самовыполняющаяся функция создает новый контекст, и именно это влияет на цикл сборки мусора с поведением, которое я (возможно, мы) хотим.

Попробуйте и дайте нам знать!

person Brian Zitzow    schedule 15.01.2014