如何更新indexedDB中的数据?

Mic*_*ael 9 javascript html5 indexeddb

我试图从W3C获取有关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);
    }                   
}
Run Code Online (Sandbox Code Playgroud)

我有所有DBM.activitati.(添加|删除| getAll | getById | getByIndex)方法工作,但我无法解决这个问题.

如果您知道我如何管理它,请告诉我们!

谢谢!

bul*_*ley 17

有关如何更新IDB记录的一些示例,请查看此jsfiddle.我使用另一个StackOverflower工作 - 这是一个相当不错的独立的IndexedDB示例,它使用索引并进行更新.

您似乎正在寻找的方法是put,如果有唯一索引,它将插入或更新记录.在那个示例小提琴中,它的使用方式如下:

    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);
        };
    };
Run Code Online (Sandbox Code Playgroud)

对于它的价值,你有一些可能的语法错误,拼错"控制台" console.log作为"conosole".

  • IDB很棒.问一下你是否遇到问题,还要搜索SO以寻找答案.我尽量不让任何问题得不到回答. (2认同)
  • 小提琴似乎不起作用(铬) - 只是让你知道... (2认同)

Lut*_*utz 6

答案有点晚了,但可能对其他人有帮助。正如我猜测的那样,我仍然偶然发现了同样的问题,但它非常简单:

如果您想插入或更新您使用的记录objectStore.put(object) (帮助)
如果您只想插入您使用的记录objectStore.add(object) (帮助)

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

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