SafariのHTML5ストレージでトランザクションは可能ですか
-
05-07-2019 - |
質問
SQLステートメントのリストを含むJSONファイルで各ループを実行し、それらを一度に1つずつ渡すのではなく、Safariクライアント側のストレージを使用して、単に「BEGIN TRANSACTION」でデータをラップすることができます。 /"トランザクションをコミット"それを1回の呼び出しでデータベースシステムに渡しますか? 1,000以上のステートメントのループには時間がかかりすぎます。
現在、一度に1つのトランザクションを繰り返す:
$j.getJSON("update1.json", function(data){ $j.each(data, function(i,item){ testDB.transaction( function (transaction) { transaction.executeSql(data[i], [], nullDataHandler, errorHandler); } ); }); });
コールを1回だけ行う方法を見つけようとしています:
$j.getJSON("update1.json", function(data){ testDB.transaction( function (transaction) { transaction.executeSql(data, [], nullDataHandler, errorHandler); } ); });
これを試して成功した人はいますか?
解決
ドキュメントで見つけることができるすべての例は、 executeSql
コマンドごとに1つの SQL
ステートメントのみを示しているようです。 「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);
}
}
);
}
);
トランザクション内でループを移動し、 for i =
を使用すると、ループの速度が少し向上します。 $。each
は1000回未満の反復に適しています。その後、ネイティブの for(var = i ...
はおそらくより高速になります。
注コードを使用して、SQLステートメントのいずれかがエラーをスローすると、トランザクション全体が失敗します。それが意図しない場合は、トランザクションの外側でループを維持する必要があります。
他のヒント
HTML5データベースストレージを混乱させたことはありません(ただし、local / sessionStorageがあります)。1つの巨大な文字列を実行できると想定します。 data.join(
separator here
)
を使用して、 data
配列。
はい、webSQLを使用して、単一のトランザクション内でステートメントのグループ全体を処理できます。実際にはBEGINまたはCOMMITを使用する必要さえありません。同じトランザクションからすべてのexecuteSql呼び出しを行う限り、これは自動的に処理されます。これを行う限り、すべてのステートメントがトランザクションに含まれます。
これにより、プロセスが非常に高速になり、ステートメントの1つにエラーがある場合にトランザクション全体がロールバックされるようになります。