Как обновить данные в indexedDB?

Я попытался получить некоторую информацию от W3C по что касается обновления элемента objectStore в базе данных indexedDB, но с не таким большим susccess. Я нашел здесь способ сделать это, но это действительно не работает для меня.

моя реализация-это что-то вроде этого

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.(добавить | удалить | getAll | getById | getByIndex) методы работают, но я не могу решить эту проблему.

Если вы знаете, как я могу успокойтесь, пожалуйста, скажите!

спасибо!

4 ответов


зацените jsfiddle для некоторых примеров о том, как обновлять записи IDB. Я работал над этим с другим StackOverflower - это довольно приличный автономный пример IndexedDB, который использует индексы и делает обновления.

метод, который вы, кажется, ищем put, который будет вставлять или обновлять запись, если есть уникальные индексы. В этом примере 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" в console.log как "conosole".


немного поздно для ответа, но возможно это поможет другим. Я все еще спотыкался -как мне кажется-над той же проблемой, но это очень просто:

если вы хотите вставить или обновить записи, которые вы используете objectStore.put(object) (справка)
Если вы хотите вставить только записи, вы используете objectStore.add(object) (справка)

если вы используете add(object), и ключ записи все еще существует в БД, он не будет перезаписан и вызывает ошибку 0 " ConstraintError: Key уже существует в объекте хранить."

Если вы используете put(object), он будет перезаписан.


Это случай обновления информации объекта пользователя

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

Я опоздал на пару лет, но подумал, что было бы неплохо добавить мои два цента.

во-первых, проверить BakedGoods если вы не хотите иметь дело со сложным API IndexedDB.

это библиотека, которая устанавливает единый интерфейс, который может использоваться для проведения операций хранения во всех родных и некоторых неродных клиентских хранилищах. Оно также поддерживает гибкость и варианты позволенные к потребителю каждым. О, и это поддерживается вашим действительно. ):

С ним размещение одного или нескольких элементов данных в хранилище объектов может быть таким же простым, как:

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