我在Windows 8项目(js/html)中使用SQLite3-WinRT库https://github.com/doo/SQLite3-WinRT。
我创建了一个在for循环中调用的函数。 我有这样的错误:winjs sqlite数据库被锁定
SQLiteError: 0x800700aa: eachAsync("INSERT INTO home (id, url, cksum)VALUES (16, 'main_page_2.jpg', 'e0d046ca3421a3c2df328b293ad5981a');",) database is locked
我认为错误是因为我创建一个新的连接循环的每个迭代,但我不明白的另一种方法。谁能帮我?
这是函数:
function insertInDB(dbPath, tbName, arrayCol, arrayVal) {
SQLite3JS.openAsync(dbPath).then(function (db) {
var query = "INSERT INTO " + tbName;
var column = " (";
var values = "VALUES (";
for (var i = 0; i < arrayCol.length; i++) {
if (i == arrayCol.length - 1) {
column = column + arrayCol[i] + ")";
} else {
column = column + arrayCol[i] + ", ";
}
}
for (var i = 0; i < arrayVal.length; i++) {
if (i == arrayCol.length - 1) {
values = values + arrayVal[i] + ");";
} else {
values = values + arrayVal[i] + ", ";
}
}
query = query + column + values;
return db.eachAsync(query).done(function() {
console.log("Ok");
db.close();
},
function (error) { console.log(error); },
function (progress) { });
});
}
,这是调用以前的函数循环:
listHome.forEach(function(value, index, array){
var valconfig = new Array(value.id, "'" + value.url + "'", "'" + value.cksum + "'");
console.log("id=" + value.id + " url=" + value.url + " ck=" + value.cksum);
insertInDB(sqlPath, "home", colconfig, valconfig);
})
在您的代码段,没有指定值在insertInDB中为“dbPath”,“arrayCol”参数,所以我不能假设任何东西,我假设你的SQL查询工作。“transaction”代表listHome数组中的单个项目。查看listHome中的值,我发布的代码使用递归遍历值,在调度另一个事务之前检查它是否到达数组的末尾。 –
我使用你的代码,但查询只插入listhome的最后一个值。 – user3231894
我纠正了错误。现在我有另一个问题。如果我调用2次函数DBHelper.queueUpdates我有同样的错误,例如: DBHelper。queueUpdates(sqlPath,“table1”,colconfig,listHome); DBHelper.queueUpdates(sqlPath,“table2”,lconfig,listHome); 我有错误数据库被锁定 – user3231894