2012-06-26 163 views
5

He intentado obtener información del W3C con respecto a la actualización de un elemento objectStore en una base de datos indexadaDB, pero con no tanto susc. Encontré here una forma de hacerlo, pero en realidad no me funciona.¿Cómo actualizo los datos en indexedDB?

Mi aplicación es algo como esto

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

tengo todo DBM.activitati (añadir | quitar | getAll | getById | getByIndex). Métodos de trabajo, pero no puede resolver esto.

Si sabe cómo puedo hacerlo, ¡dígalo!

Gracias!

Respuesta

14

Consulte este jsfiddle para obtener algunos ejemplos sobre cómo actualizar los registros del BID. Trabajé en eso con otro StackOverflower: es un ejemplo autónomo bastante decente de IndexedDB que usa índices y hace actualizaciones.

El método que parece que está buscando es put, que insertará o actualizará un registro si hay índices únicos. En ese ejemplo el violín, se utiliza la siguiente manera:

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

Por lo que vale la pena, tienes algunos de los posibles errores de sintaxis, falta de ortografía "consola" en console.log como "conosole".

+0

¡Gracias! ¡Este indexedDB se ve cada vez mejor! Pensé que no sabía manejar esto tan fácil ... – Michael

+2

IDB es increíble. Pregunte si tiene problemas, pero también busque SO para obtener respuestas. Intento no dejar que ninguna pregunta quede sin respuesta. – buley

+2

el violín no parece estar funcionando (cromo), simplemente haciéndole saber ... – Reinsbrain

1

este es el caso de informaciones de actualización de un objeto de usuario

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

Gracias por llamar la atención sobre cursor.update(). MDN: "Devuelve un objeto IDBRequest y, en un subproceso separado, actualiza el valor en la posición actual del cursor en el almacén de objetos. Esto se puede usar para actualizar registros específicos". – Velojet

2

Un poco tarde para una respuesta, pero es posible que ayuda a los demás. Todavía topé -como i guess- sobre el mismo problema, pero es muy simple:

Si desea insertar o actualizar registros que utilizar objectStore.put(object)(help)
Si sólo desea insertar registros que utiliza objectStore.add(object)(help)

Por lo tanto, si usa add(object), y aún existe una clave de registro en la base de datos, no se sobrescribirá y desencadena el error 0 "ConstraintError: la clave ya existe en el almacén de objetos".

Si usa put(object), se sobrescribirá.

1

Soy un par de años de retraso, pero pensé que sería bueno añadir mi granito de arena en.

En primer lugar, echa un vistazo a BakedGoods si no quiere tratar con la API de datos indexada compleja.

Es una biblioteca que establece una interfaz uniforme que se puede utilizar para realizar operaciones de almacenamiento en todas las instalaciones de almacenamiento de clientes nativos y no nativos. También mantiene la flexibilidad y las opciones brindadas al usuario por cada uno. Ah, y es mantenido por los tuyos verdaderamente :).

Con él, la colocación de uno o más elementos de datos en un almacén de objetos puede ser tan simple como:

bakedGoods.set({ 
    data: [{key: "key1", value: "value1"}, {key: "key2", value: "value2"}), 
    storageTypes: ["indexedDB"], 
    complete: function(byStorageTypeResultDataObj, byStorageTypeErrorObj){} 
}); 

Ahora responder a la pregunta real ...

Comencemos mediante la agregación de la información valiosa repartidas en las respuestas existentes:

  • IDBObjectStore.put() agrega un nuevo registro a la tienda, o actualiza una existente

  • IDBObjectStore.add() agrega un nuevo registro a la tienda

  • IDBCursor.update() actualiza el registro en la posición actual del cursor

Como se puede ver, OP está utilizando un método apropiado para actualizar un registro. Hay, sin embargo, varias cosas en su código, no relacionadas con el método, que son incorrectas (con respecto a la API de hoy al menos). Los he identificado y corregido a continuación:

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