1

在 Android 上使用 phonegap 在单个事务上可以运行的 executeSql 语句的数量是否有限制?我正在开始一个事务 (db.transaction(...)),然后遍历大约 4000 个产品。对于每个产品,我都在执行一个 executeSql INSERT 语句 (tx.executeSql(...))。所有的 executeSql INSERT 语句似乎都处理得很好,但是一旦它到达最后一个,我就会收到“内存不足”错误。该错误还指出“用户未能允许分配更多内存”。它在 iOS 和 Ripple 上运行良好,但在 Android 上是无用的!

4

1 回答 1

1

在 Android 上使用 phonegap 在单个事务上可以运行的 executeSql 语句的数量是否有限制?

据我所知,sqlite、phonegap、android的具体使用没有限制。

我还尝试在循环中插入事务,每次迭代插入大约 8MB 的数据。

我也经历过Android内存不足。

就我而言,解决方案是将 executeSql() 方法包装在匿名自执行函数中。

仅在 Android 上导致内存溢出的原始代码:

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

允许正确垃圾收集的解决方案:

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

老实说,此刻我不完全明白为什么。我的猜测是匿名自执行函数创建了一个新的上下文,这就是影响垃圾收集周期的原因,我(也许我们)想要的行为。

试一试,让我们知道!

于 2014-01-15T21:42:08.087 回答