Как обновить данные в 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 :)
}