如何更新indexedDB中的数据?

时间:2012-06-26 23:21:06

标签: javascript html5 indexeddb

我试图从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)方法有效,但我无法解决这个问题。

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

谢谢!

4 个答案:

答案 0 :(得分: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);
        };
    };

对于它的价值,你有一些可能的语法错误,在console.log拼写错误的“控制台”为“conosole”。

答案 1 :(得分:3)

答案有点迟,但可能有助于其他人。我仍然偶然发现 - 我猜 - 同样的问题,但它很简单:

如果您想要INSERT或UPDATE记录,请使用objectStore.put(object) (help)
如果您只想INSERT记录,请使用objectStore.add(object) (help)

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

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

答案 2 :(得分:1)

这是用户对象的更新信息

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

答案 3 :(得分:1)

我已经迟了几年了,但我觉得加入我的两美分真好。

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

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

有了它,将一个或多个数据项放在对象库中就可以这么简单:

IDBObjectStore.put()

现在回答实际问题......

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

  • IDBObjectStore.add()向商店添加新记录,或更新现有记录

  • IDBCursor.update()向商店添加新记录

  • 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 :) } 更新光标当前位置的记录

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

DB::commit();