16

我试图从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);
    }                   
}

我有所有 DBM.activitati.(add | remove | getAll | getById | getByIndex) 方法工作,但我无法解决这个问题。

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

谢谢!

4

4 回答 4

27

查看这个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”拼错console.log为“conosole”。

于 2012-06-26T23:37:13.227 回答
5

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

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

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

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

于 2016-04-24T09:40:27.340 回答
2

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

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");
    }
}
于 2015-11-09T08:54:30.980 回答
2

我迟到了几年,但认为加上我的两分钱会很好。

首先,如果您不想处理复杂的 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 :)
}      
于 2016-07-09T22:33:50.370 回答