我有一个简单的脚本,我需要循环浏览一些json数据并将其插入到我的WebSQL数据库中,该行已不存在。
以下代码可以解决问题:
var name;
var dbSize = 5 * 1024 * 1024; // 5MB
var db;
db = openDatabase("db", "", "Woonscan Database", dbSize, function() {
console.log('db successfully opened or created');
});
var json = [{"Project":{"id":"10","name":"Promens Care","archive":"0"}}, {"Project":{"id":"12","name":"Woonconcept","archive":"0"}}];
var project_id, name;
db.transaction(function (tx) {
tx.executeSql('DROP TABLE IF EXISTS projects');
tx.executeSql("CREATE TABLE IF NOT EXISTS projects (ID INTEGER PRIMARY KEY ASC, project_id INTEGER, name TEXT)");
insertRow = function(project_id, name){
db.transaction(function (tx) {
tx.executeSql("INSERT INTO projects(project_id, name) VALUES (?, ?)", [project_id, name]);
});
}
for(var i=0;i < json.length;i++) {
console.log(JSON.stringify(json));
project_id = json[i].Project.id;
name = json[i].Project.name;
tx.executeSql("SELECT * FROM projects WHERE project_id = ?", [project_id], function(tx, result){
console.log(result);
// console.log(result.rows.item(0));
var len = result.rows.length;
if(len == 0){
console.log(JSON.stringify(result));
insertRow(project_id, name);
} else{
console.log('Row exists: ' + JSON.stringify(result));
}
});
}
});
在我的情况下,JSON对象有2个子节点(ID:10和ID:12),for循环通过它循环,它将被插入。但是,第二个插入包含第一个插入的值。一个console.log或一个警告会打印出正确的值,所以我有点迷失了。我在某个地方犯了大错吗?
答案 0 :(得分:2)
但是,第二个插入包含第一个插入的值。
这里有很多问题。主要是你在一个事务中打开另一个事务(在一个循环中调用插入行已经在一个事务中)。
我需要遍历一些json数据并将其插入到我的内部 WebSQL将它排除在行之外。
最好的办法**来处理这个问题 - 让它成为
使用Insert or Replace
代替简单Insert
insertRow = function(project_id, name){
db.transaction(function (tx) {
tx.executeSql("INSERT OR REPLACE INTO projects(project_id, name) VALUES (?, ?)", [project_id, name]);
});
}
无需检查该值是否已存在。