我使用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输出时,我的工作。但是脚本不会将数据保存在数据库中。
答案 0 :(得分:1)
tx.executeSql
中的每一个都是异步执行的,因此在执行每个查询i == n
和aa == 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
上找到更多信息如果您找到更好的解决方案,请在此处发布:)