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 に答える