Javascript SQL 插入循环
Javascript SQL Insert Loop
我试图通过一个循环向函数传递一个数组,该数组应该 运行 并为每个递增的 SQL 语句调用 db.transaction。
function updateColorData (colorArray) {
for (var i=0; i<colorArray.length; i++) {
var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')';
if (i < colorArray.length-1) {
db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
} else {
db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
}
}
}
作为测试,我正在调用传递数组的 updateColorData 函数,如下所示
['one', 'two', 'three', 'four']
但是当我让数据库读回它收到的信息时,我得到
['four', 'four', 'four', 'four']
我意识到像这样在循环中调用 4 个数据库事务并不是最有效的方法,但我不确定为什么这不起作用或尝试其他方法。
谢谢!
在调用数据库函数之前,您需要为i
创建一个新的作用域;试试这个:
function updateColorData (colorArray) {
for (var i=0; i<colorArray.length; i++) {
(function(i){
var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')';
if (i < colorArray.length-1) {
db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
} else {
db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
}
})(i);
}
}
使用匿名函数为 i
的每个值创建一个单独的函数作用域。您需要这样做,因为原始示例中的 for
循环不断更新 i
,而无需等待您的数据库函数变为 return。因此,您需要为数据库函数创建 "safe" 上下文 运行,而 for
循环不会更改 i
的值,这正是匿名函数所提供的。
我试图通过一个循环向函数传递一个数组,该数组应该 运行 并为每个递增的 SQL 语句调用 db.transaction。
function updateColorData (colorArray) {
for (var i=0; i<colorArray.length; i++) {
var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')';
if (i < colorArray.length-1) {
db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
} else {
db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
}
}
}
作为测试,我正在调用传递数组的 updateColorData 函数,如下所示
['one', 'two', 'three', 'four']
但是当我让数据库读回它收到的信息时,我得到
['four', 'four', 'four', 'four']
我意识到像这样在循环中调用 4 个数据库事务并不是最有效的方法,但我不确定为什么这不起作用或尝试其他方法。
谢谢!
在调用数据库函数之前,您需要为i
创建一个新的作用域;试试这个:
function updateColorData (colorArray) {
for (var i=0; i<colorArray.length; i++) {
(function(i){
var sql = 'INSERT INTO SPColorData (color) VALUES (\''+colorArray[i]+'\')';
if (i < colorArray.length-1) {
db.transaction(function (tx) {tx.executeSql(sql, [], gameOptionSuccess, errorCB)}, errorCB);
} else {
db.transaction(function (tx) {tx.executeSql(sql, [], colorDataQuery, errorCB)}, errorCB);
}
})(i);
}
}
使用匿名函数为 i
的每个值创建一个单独的函数作用域。您需要这样做,因为原始示例中的 for
循环不断更新 i
,而无需等待您的数据库函数变为 return。因此,您需要为数据库函数创建 "safe" 上下文 运行,而 for
循环不会更改 i
的值,这正是匿名函数所提供的。