Javascript 在indexedDB中更新对象时避免约束错误

Javascript 在indexedDB中更新对象时避免约束错误,javascript,indexeddb,Javascript,Indexeddb,我有一个SET函数,它使用特定的键将对象设置为IndexedDB: _that.set = function(data, key) { var transaction = _db.transaction([_tblName], "readwrite"), store = transaction.objectStore(_tblName), request = store.add(data, key); request.onerror = fun

我有一个SET函数,它使用特定的键将对象设置为IndexedDB:

_that.set = function(data, key) {
    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName), 
        request = store.add(data, key);

    request.onerror = function(e) {
        console.log("Error", e.target.error.name);
    };

    request.onsuccess = function(e) {
        console.log("Added to db successfully.");
    };
};
_that.update = function(data, key) {

    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName),
        request = store.put(data, key);

    request.onerror = function(e) {
        console.log("Error", e.target.error.name);
    };

    request.onsuccess = function(e) {
        console.log("Object been updated", key);
    };
};
我有一个更新函数,它用特定的键更新IndexedDB中的对象:

_that.set = function(data, key) {
    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName), 
        request = store.add(data, key);

    request.onerror = function(e) {
        console.log("Error", e.target.error.name);
    };

    request.onsuccess = function(e) {
        console.log("Added to db successfully.");
    };
};
_that.update = function(data, key) {

    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName),
        request = store.put(data, key);

    request.onerror = function(e) {
        console.log("Error", e.target.error.name);
    };

    request.onsuccess = function(e) {
        console.log("Object been updated", key);
    };
};
我得到了一个函数:

_that.get = function(key, callback) {

    if (key === "" || isNaN(key)) {
        return;
    }

    var transaction = _db.transaction([_tblName], "readonly"), 
        store = transaction.objectStore(_tblName), 
        request = store.get(key);

    request.onsuccess = function(e) {
        var res = e.target.result;
        callback(key, res);
    };
};
我想为IndexedDB创建SETORUPDATE函数,它将作为SET函数工作,万一onerror事件将调用GET函数,更新数据,然后调用update函数。错误为ConstraintError,这意味着数据库中已存在具有相应键的对象。有没有办法避免这个错误在控制台中出现,而是触发GET和UPDATE?注意:前面带有下划线符号的变量是在类顶部声明并在构造函数中初始化的实例变量

更新:只有在表中已经存在具有某个对象的键的情况下,我才需要在使用相同的键更新数据变量之前更改数据变量的值。这就是为什么在更新之前检查同一密钥是否已经存在很重要的原因。我想要这样的东西:

_that.setOrUpdate = function(data, key) {
    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName), 
        request = store.add(data, key);

    request.onsuccess = function(e) {
        console.log("Added to db successfully.");
    };

    request.onerror = function(e) {
        _that.get(key);
        // make some changes to the data
        _that.update(data, key);
    };
};

如果密钥已经存在,它将更新一个对象,否则它将添加一个新对象。因此,您可以将
update
函数重命名为
setorupdate
,并在任何地方使用它。

实际上我自己已经解决了这个问题。我可以先使用GET方法,然后在ONSUCCESS上更新

_that.setOrUpdate = function(newValSerialized, key) {
    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName),
        request = store.get(key);

    request.onsuccess = function(e) {
        var oldValSerialized = e.target.result;

        // make changes to data and put it as newVal object.           
        requestUpdate = store.put(newVal, key);

    };

    request.onerror = function(e) {
        console.dir(e.target.error.name);
    };
};

其思想是GET方法永远不会返回。它要么找到它,要么给出未定义的。更新方法也将进行更新或添加。因此,我不会在控制台中看到错误。

在使用相同的键将对象放回之前,我需要对对象的值进行一些更改。我已更新了我的问题。对不起,你说的对,我问的不对。它应该在onerror函数中工作。有什么问题?