重复插入 WebSQL

Duplicate insert WebSQL

我有一个简单的脚本,我需要循环遍历一些 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 或警报会向我打印正确的值,所以我现在有点迷路了。我是不是哪里犯了大错..?

However, the second insert contains the values of the first insert.

这里有多个问题。主要是您在一个事务中打开另一个事务(在已经在事务中的循环中插入被调用的行)。

I need to loop through some json data and insert this inside my WebSQL db it the row doesn't exist already.

处理这个问题的最佳方法** - 做到这一点

使用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]);
        });
    } 

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