重复插入WebSQL

时间:2016-02-17 09:22:21

标签: javascript json transactions web-sql

我有一个简单的脚本,我需要循环浏览一些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或一个警告会打印出正确的值,所以我有点迷失了。我在某个地方犯了大错吗?

1 个答案:

答案 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]);
        });
    } 

无需检查该值是否已存在。