4

Google Chrome 拡張機能を使用して Web 上のデータをスクラップします。それらを多次元配列に格納します。すべての論文データを Sqlite データベースに保存したいと考えています。

このページを読みましたHTML5を使用して1000のレコードをsqliteに挿入するときにプロセスをスピードアップする方法ですが、与えられた答えはうまくいかないようです。

INSERTごとにトランザクションを開くと機能します

i=0;
while(i<n){
    (function(aa){
        db.transaction(function (tx) {
             tx.executeSql("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+aa[0]+"', "+parseInt(aa[1])+", '"+parseInt(aa[2])+"', '"+aa[3]+"', '"+aa[4]+"', '"+aa[5]+"')");
        });
    })(myDataArray[i]);    
    i++;
}

問題は、 Whileの前にトランザクションを開こうとしたときです。

db.transaction(function (tx) {
    i=0;
    while(i<n){
        aa = myDataArray[i];
        txquer(tx, i, aa[0], parseInt(aa[1]), parseInt(aa[2]), aa[3], aa[4], aa[5]);
        i++;
    }
});
function txquer(tx,i,a,b,c,d,e,f){  
    console.log("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+a+"', "+b+", '"+c+"', '"+d+"', '"+e+"', '"+f+"')");
    tx.executeSql("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+a+"', "+b+", '"+c+"', '"+d+"', '"+e+"', '"+f+"')");
} 

すべての console.log 出力を個別にテストすると、動作します。ただし、スクリプトはデータをデータベースに保存しません。

4

2 に答える 2

1

のそれぞれは非同期で実行されるため、各クエリの実行時にtx.executeSqlwhile ループはすでに終了しています。i == naa == myDataArray[i-1]

[編集]

オーバーライドされないように、呼び出しをtx.executeSqlクロージャー内に保持する必要があります。aa

db.transaction(function (tx) {
    i=0;
    while(i<n){
        (function(aa){
            txquer(tx, i, aa[0], parseInt(aa[1]), parseInt(aa[2]), aa[3], aa[4], aa[5]);
        })(myDataArray[i]);
        i++;
    }
});

function txquer(tx,i,a,b,c,d,e,f){  
    console.log("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+a+"', "+b+", '"+c+"', '"+d+"', '"+e+"', '"+f+"')");
    tx.executeSql("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+a+"', "+b+", '"+c+"', '"+d+"', '"+e+"', '"+f+"')");
}

このコードをテストできなかったため、機能しているかどうかはわかりませんが、アイデアが得られることを願っています.

于 2013-06-27T10:20:50.117 に答える
0

私は解決策を見つけました!これは最善の方法ではないかもしれませんが、毎回トランザクションを開くよりもはるかに高速です。

主なアイデアは、前の executeSql が完了したときに次のexecuteSqlを実行することです。再帰関数を実装しました。

n=mainDataArray.length;
console.log(mainDataArray);
//Saving the array in the db
db.transaction(function(tx) {   
    saveData = function(dataArray,k){
        var aa = dataArray[k];
        console.log(aa);
        tx.executeSql("INSERT INTO Links2 (c1, c2, c3, c4, c5, c6) VALUES ('"+aa[0]+"', "+parseInt(aa[1])+", '"+parseInt(aa[2])+"', '"+aa[3]+"', '"+aa[4]+"', '"+aa[5]+"')", [], 
        function (tx, callback) {
            console.log("ok "+dataArray.length+" | k="+k);
            if(k<(dataArray.length-1)){
               saveData(dataArray,(k+1));
            }
        },
        function (tx, error) {
            console.log("error "+dataArray.length+" | k="+k);
            if(k<(dataArray.length-1)){
               saveData(dataArray,(k+1));
            }
        });
    }
    saveData(mainDataArray,0);
});

詳細については、この Web サイトの「Saving an Array into a Sqlite database with javascript」を参照してください。

より良い解決策を見つけたら、ここに投稿してください:)

于 2013-06-27T12:12:15.787 に答える