使用javascript将大数组保存到Sqlite数据库中

时间:2013-06-27 10:00:44

标签: javascript sqlite google-chrome-extension

我使用Google Chrome扩展程序废弃了网络上的数据。我将它们存储在一个多维数组中。我想将所有这些数据保存在Sqlite数据库中。

我读了这页How to speed up the process when inserting 1000's of records into sqlite using HTML5,但给出的答案似乎不起作用。

当我为每个 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输出时,我的工作。但是脚本不会将数据保存在数据库中。

2 个答案:

答案 0 :(得分:1)

tx.executeSql中的每一个都是异步执行的,因此在执行每个查询i == naa == myDataArray[i-1]时,while循环将会结束。

[编辑]

您应该在闭包内保持对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+"')");
}

无法测试此代码,所以我不确定它是否有效,但我希望你能理解。

答案 1 :(得分:0)

我找到了解决方案!它不是最好的方法,但它比每次交易时打开要快得多。

主要思想是在完成上一个 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);
});

您可以在此网站Saving an Array into a Sqlite database with javascript

上找到更多信息

如果您找到更好的解决方案,请在此处发布:)