Есть ли ограничение на количество операторов executeSql, которые вы можете запустить в одной транзакции, используя phonegap на Android? Я начинаю транзакцию (db.transaction(...)) и затем перебираю около 4000 продуктов. Для каждого продукта я выполняю оператор executeSql INSERT (tx.executeSql(...)). Кажется, что все операторы executeSql INSERT обрабатываются нормально, но как только он достигает последнего, я получаю сообщение об ошибке «Недостаточно памяти». В ошибке также говорится, что «пользователю не удалось разрешить выделение дополнительной памяти». Он отлично работает на iOS и в Ripple, но Android не работает!
Есть ли ограничение на количество операторов executeSql, которые вы можете запустить в одной транзакции, используя phonegap на Android?
Ответы (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
});
});
Я должен быть честным, в этот момент я не совсем понимаю, почему. Я предполагаю, что анонимная самовыполняющаяся функция создает новый контекст, и именно это влияет на цикл сборки мусора с поведением, которое я (возможно, мы) хотим.
Попробуйте и дайте нам знать!