【问题标题】:How do I update data in indexedDB?如何更新 indexedDB 中的数据?
【发布时间】:2012-06-28 08:38:04
【问题描述】:

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

我的实现是这样的

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.activitati.(add | remove | getAll | getById | getByIndex) 方法都在工作,但我无法解决这个问题。

如果你知道我该如何管理它,请告诉我!

谢谢!

【问题讨论】:

    标签: javascript html indexeddb


    【解决方案1】:

    我迟到了几年,但我觉得把我的两分钱加进去会很好。

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

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

    有了它,在对象存储中放置一个或多个数据项可以很简单:

    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 :)
    }      
    

    【讨论】:

      【解决方案2】:

      答案有点晚,但可能对其他人有所帮助。我仍然偶然发现了同样的问题,但很简单:

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

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

      如果使用put(object),则会被覆盖。

      【讨论】:

        【解决方案3】:

        这是用户对象更新信息的情况

        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");
            }
        }
        

        【讨论】:

        • 感谢您关注 cursor.update()。 MDN:“返回一个 IDBRequest 对象,并在单独的线程中更新对象存储中光标当前位置的值。这可用于更新特定记录。”
        【解决方案4】:

        查看jsfiddle 了解有关如何更新 IDB 记录的一些示例。我使用另一个 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);
                };
            };
        

        不管怎样,您可能会遇到一些语法错误,将console.log 中的“console”拼错为“conosole”。

        【讨论】:

        • 谢谢!这个 indexedDB 看起来越来越好!我以为它不知道这么容易处理..
        • IDB 很棒。如果您遇到问题,请询问,但也可以搜索有关内容的答案。我尽量不让任何问题得不到解答。
        • 清晰易懂,易于实施,+1
        • @buley 如何将值附加到 IDB 中的数组字段?
        猜你喜欢
        • 2022-10-08
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-24
        相关资源
        最近更新 更多