1

SQLステートメントのリストを含むJSONファイルで各ループを実行して一度に1つずつ渡す代わりに、Safariクライアント側ストレージでデータを「BEGIN TRANSACTION」/「COMMIT TRANSACTION」でラップして渡すことができますか?単一の呼び出しでデータベース システムに? 1,000 以上のステートメントをループすると、時間がかかりすぎます。

現在、一度に 1 つのトランザクションを繰り返しています。

$j.getJSON("update1.json",
  関数(データ){
    $j.each(データ、関数(i、アイテム){
            testDB.transaction(
                関数 (トランザクション) {
                    transaction.executeSql(data[i], [], nullDataHandler, errorHandler);
                }
            );
   });
});

1回だけ電話をかける方法を見つけようとしています:

$j.getJSON("update1.json",
  関数(データ){
            testDB.transaction(
                関数 (トランザクション) {
                    transaction.executeSql(data, [], nullDataHandler, errorHandler);
                }
            );
});

これを試して成功した人はいますか?

4

3 に答える 3

1

ドキュメントで見つけることができるすべての例は、コマンドSQLごとに 1 つのステートメントのみを示しているようです。executeSql「ajax spinner」ローディング グラフィックを表示し、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 =、ループの速度が少し速くなるはずです。$.each1000回未満の反復に適しています。その後は、ネイティブのfor(var = i...方がおそらく高速になります。

私のコードを使用すると、SQL ステートメントのいずれかがエラーをスローすると、トランザクション全体が失敗します。それが意図されていない場合は、ループをトランザクションの外に置く必要があります。

于 2009-11-29T21:15:26.153 に答える
0

HTML5データベースストレージをいじったことはありません(ただし、local / sessionStorageを使用しています)。1つの巨大なステートメント文字列を実行できると思います。配列の文字列表現を取得するために使用します。data.join(separator here)data

于 2009-11-25T22:04:21.370 に答える
0

はい、webSQL を使用すると、単一のトランザクション内で一連のステートメント全体を処理できます。実際には、BEGIN や COMMIT を使用する必要さえありません。同じトランザクションからすべての executeSql 呼び出しを行う限り、これは自動的に処理されます。これを行う限り、すべてのステートメントがトランザクションに含まれます。

これにより、プロセスが大幅に高速化され、ステートメントの 1 つにエラーが発生すると、トランザクション全体がロールバックされます。

于 2011-11-07T22:25:47.250 に答える