Javascript 如何更新indexedDB中的数据?

Javascript 如何更新indexedDB中的数据?,javascript,html,indexeddb,Javascript,Html,Indexeddb,我曾试图从indexedDB数据库中获取有关objectStore项更新的一些信息,但没有那么成功。 我找到了一种方法,但对我来说并不管用 我的实现是这样的 DBM.activitati.edit = function(id, obj, callback){ var transaction = DBM.db.transaction(["activitati"], IDBTransaction.READ_WRITE); var objectStore = transaction.o

我曾试图从indexedDB数据库中获取有关objectStore项更新的一些信息,但没有那么成功。 我找到了一种方法,但对我来说并不管用

我的实现是这样的

DBM.activitati.edit = function(id, obj, callback){
    var transaction = DBM.db.transaction(["activitati"], IDBTransaction.READ_WRITE);
    var objectStore = transaction.objectStore("activitati");
    var keyRange = IDBKeyRange.only(id);

    objCursor = objectStore.openCursor(keyRange);
    objCursor.onsuccess = function(e){
        var cursor = e.target.result;
        console.log(obj);
        var request = cursor.update(obj);
        request.onsuccess = function(){
            callback();
        }
        request.onerror = function(e){
            conosole.log("DBM.activitati.edit -> error " + e);
        }

    }   
    objCursor.onerror = function(e){
        conosole.log("DBM.activitati.edit -> error " + e);
    }                   
}
我所有的DBM.activati(add | remove | getAll | getById | getByIndex)方法都在工作,但我无法解决这个问题

如果你知道我怎么办,请告诉我

谢谢大家!

查看下面的示例,了解如何更新IDB记录。我用另一个StackOverflower解决了这个问题——这是IndexedDB的一个相当不错的独立示例,它使用索引并进行更新

您似乎正在寻找的方法是,如果存在唯一索引,它将插入或更新记录。在该示例中,fiddle的用法如下:

    phodaDB.indexedDB.addUser = function(userObject){
        //console.log('adding entry: '+entryTxt);
        var db = phodaDB.indexedDB.db;
        var trans = db.transaction(["userData"],IDBTransaction.READ_WRITE);
        var store = trans.objectStore("userData");
        var request = store.put(userObject);

        request.onsuccess = function(e){
            phodaDB.indexedDB.getAllEntries();
        };
        request.onerror = function(e){
            console.log('Error adding: '+e);
        };
    };

值得一提的是,您可能有一些语法错误,将
console.log
中的“console”拼错为“conosole”。

这是用户对象的更新信息

var transaction = db.transaction(["tab_user"], "readwrite");
var store = transaction.objectStore("tab_user");

var req = store.openCursor();
req.onerror = function(event) {
  console.log("case if have an error");
};

req.onsuccess = function(event) {
    var cursor = event.target.result;
    if(cursor){
        if(cursor.value.idUser == users.idUser){//we find by id an user we want to update
            var user = {};
            user.idUser = users.idUser ;
            user.nom = users.nom ;

            var res = cursor.update(user);
            res.onsuccess = function(e){
                console.log("update success!!");
            }
            res.onerror = function(e){
                console.log("update failed!!");
            }
        }
        cursor.continue();
    }
    else{
        console.log("fin mise a jour");
    }
}

回答有点晚,但可能对其他人有帮助。正如我猜想的那样,我仍然在同一个问题上绊倒,但这很简单:

如果要插入或更新记录,请使用
objectStore.put(object)

如果只想插入记录,请使用
objectStore.add(object)

因此,如果您使用
add(object)
,并且数据库中仍然存在记录键,它将不会被覆盖并触发错误0“ConstraintError:对象存储中已存在记录键”。


如果您使用
put(object)
,它将被覆盖。

我迟到了几年,但我想最好能加上我的两分钱

首先,如果您不想处理复杂的IndexedDB API,请查看

它是一个建立统一接口的库,可用于在所有本机和一些非本机客户端存储设施中执行存储操作。它还保持了每个用户提供给用户的灵活性和选项。哦,它是由你真正维护的:)

使用它,在对象存储中放置一个或多个数据项可以非常简单:

bakedGoods.set({
    data: [{key: "key1", value: "value1"}, {key: "key2", value: "value2"}),
    storageTypes: ["indexedDB"],
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){}
});

现在回答实际问题

首先,让我们汇总分布在现有答案中的有价值信息:

  • IDBObjectStore.put()
    向存储添加新记录,或更新现有记录

  • IDBObjectStore.add()
    向存储添加新记录

  • IDBCursor.update()
    更新光标当前位置的记录

可以看出,OP正在使用适当的方法更新记录。然而,在他/她的代码中,有一些与方法无关的东西是不正确的(至少就今天的API而言)。我已经在下面识别并更正了它们:

var cursorRequest = objectStore.openCursor(keyRange); //Correctly define result as request

cursorRequest.onsuccess = function(e){                //Correctly set onsuccess for request
    var objCursor = cursorRequest.result;             //Get cursor from request
    var obj = objCursor.value;                        //Get value from existing cursor ref
    console.log(obj);
    var request = objCursor.update(obj);             
    request.onsuccess = function(){
        callback();
    }
    request.onerror = function(e){
        console.log("DBM.activitati.edit -> error " + e); //Use "console" to log :)
    }

}   
cursorRequest.onerror = function(e){                  //Correctly set onerror for request
    console.log("DBM.activitati.edit -> error " + e); //Use "console" to log :)
}      

非常感谢。这个indexedDB看起来越来越好!我想它不知道怎么这么容易处理这件事。IDB太棒了。如果你遇到了问题,可以主动询问,但也可以从中寻找问题的答案。我尽量不让任何问题无人回答。清晰易懂,易于实施+1@buley如何将值附加到IDB中的数组字段?感谢大家关注cursor.update()。MDN:“返回IDBRequest对象,并在单独的线程中更新对象存储中光标当前位置的值。这可用于更新特定记录。”