2012-06-26 16 views
5

Ich habe versucht, einige Informationen von W3C bezüglich der Aktualisierung eines Objektspeichers in einer indexedDB-Datenbank zu bekommen, aber mit nicht so viel Zugriff. Ich fand here einen Weg, es zu tun, aber es funktioniert nicht wirklich für mich.Wie aktualisiere ich Daten in indexedDB?

Meine Implementierung ist so etwas wie dieses

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

ich alle DBM.activitati haben (fügen | entfernen | getAll | getById | getByIndex). Methoden zu arbeiten, aber ich kann das nicht lösen.

Wenn Sie wissen, wie ich es schaffen kann, bitte, sag es!

Vielen Dank!

Antwort

14

Überprüfen Sie diese jsfiddle für einige Beispiele zum Aktualisieren von IDB-Datensätzen. Ich habe daran mit einem anderen StackOverflower gearbeitet - es ist ein ziemlich anständiges Standalone-Beispiel für IndexedDB, das Indizes verwendet und Aktualisierungen durchführt.

Die Methode, nach der Sie suchen, ist put, die einen Datensatz einfügen oder aktualisieren wird, wenn eindeutige Indizes vorhanden sind. In diesem Beispiel Geige, wird es wie folgt verwendet:

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

Für das, was es wert ist, Sie einige mögliche Syntaxfehler haben, Rechtschreibfehler „Konsole“ in console.log als „conosole“.

+0

Vielen Dank! Diese indexedDB sieht immer besser aus! Ich dachte, dass es nicht so einfach damit umgehen kann. – Michael

+2

IDB ist erstaunlich. Fragen Sie nach, ob Sie auf Probleme stoßen, aber suchen Sie auch nach Antworten auf SO. Ich versuche, keine Frage unbeantwortet zu lassen. – buley

+2

die Geige scheint nicht zu funktionieren (Chrom) - nur lassen Sie es wissen ... – Reinsbrain

1

dies ist Fall von Update-Infos eines Benutzerobjekt

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

Vielen Dank für die Aufmerksamkeit auf cursor.update(). MDN: "Gibt ein IDBRequest-Objekt zurück und aktualisiert in einem separaten Thread den Wert an der aktuellen Position des Cursors im Objektspeicher. Dies kann zum Aktualisieren bestimmter Datensätze verwendet werden." – Velojet

2

Ein bisschen spät für eine Antwort, aber möglich, es hilft anderen. Ich stolperte noch -as i guess- über das gleiche Problem, aber es ist sehr einfach:

Wenn Sie INSERT oder UPDATE Aufzeichnungen wollen verwenden Sie objectStore.put(object)(help)
Wenn Sie nur Datensätze möchten Sie objectStore.add(object)(help)

verwenden, um INSERT

Wenn Sie also add(object) verwenden und ein Datensatzschlüssel in der Datenbank noch vorhanden ist, wird er nicht überschrieben und löst den Fehler 0 "ConstraintError: Schlüssel ist bereits im Objektspeicher vorhanden" aus.

Wenn Sie put(object) verwenden, wird es überschrieben.

1

Ich bin ein paar Jahre zu spät, aber dachte, es wäre schön, meinen zwei Cent hinzufügen.

Zuerst BakedGoods überprüfen, ob Sie wollen nicht mit der komplexen IndexedDB API beschäftigen.

Es ist eine Bibliothek, die eine einheitliche Schnittstelle erstellt, die verwendet werden kann, um Speichervorgänge in allen systemeigenen und einigen nicht nativen Clientspeichereinrichtungen durchzuführen. Es behält auch die Flexibilität und die Optionen bei, die dem Benutzer von jedem geboten werden. Oh, und es wird von mir beibehalten :).

Damit platzieren ein oder mehr Datenelemente in einem Objektspeicher kann so einfach sein wie:

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

Jetzt die eigentliche Frage zu beantworten ...

Ermöglicht durch Aggregation die wertvollen Informationen über die vorhandenen Antworten verbreiten beginnen:

  • IDBObjectStore.put() fügt einen neuen Rekord in den Laden, oder aktualisiert ein vorhandenes

  • IDBObjectStore.add() einen neuen Datensatz in die Adds speichern

  • IDBCursor.update() aktualisiert den Datensatz an der aktuellen Position des Cursors

Wie man sieht, verwendet OP eine geeignete Methode, um einen Datensatz zu aktualisieren. Es gibt jedoch einige Dinge in seinem/ihrem Code, die nicht mit der Methode zusammenhängen, die inkorrekt sind (zumindest in Bezug auf die API). Ich habe sie identifiziert und unten korrigiert:

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