2016-06-22 6 views
1

Ich folgte diesem Tutorial in einem Blog, es ist nur ein Beispiel-Tutorial mit indexedDB. Ich bin neu mit indexedDB, also kann ich nur ein wenig davon verstehen.Löschen, Funktion entfernen, scheint nicht zu funktionieren

Andere Funktionen wie lesen, readAll und hinzufügen funktioniert ordnungsgemäß. Während die Funktion remove nicht funktioniert. Diese Funktionen heißen onclick über eine Schaltfläche.

Immer wenn ich auf Daten löschen klicke, verschwindet die Schaltfläche und nichts passiert.

HTML:

<!DOCTYPE html> 
<html> 
<head> 
    <meta charset="UTF-8"> 
    <script type="text/javascript" src="index.js"></script> 
    <link rel="stylesheet" type="text/css" href="index.css" media="all"> 
    <title>Sample IndexedDB</title> 
</head> 

<body> 
    <button onclick="read()">Read </button> 
    <button onclick="readAll()">Read all </button> 
    <button onclick="add()">Add data </button> 
    <button onclick="remove()">Delete data </button> 
</body> 
</html> 

Javascript:

 //prefixes of implementation that we want to test 
    window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB; 

    //prefixes of window.IDB objects 
    window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || window.msIDBTransaction; 
    window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || window.msIDBKeyRange 

    if (!window.indexedDB) { 
     window.alert("Your browser doesn't support a stable version of IndexedDB.") 
    } 

    const employeeData = [ 
     { id: "00-01", name: "gopal", age: 35, email: "[email protected]" }, 
     { id: "00-02", name: "prasad", age: 32, email: "[email protected]" } 
    ]; 
    var db; 
    var request = window.indexedDB.open("sampleDB", 3); 

    request.onerror = function(event) { 
     console.log("error: "); 
    }; 

    request.onsuccess = function(event) { 
     db = request.result; 
     console.log("success: "+ db); 
    }; 

    request.onupgradeneeded = function(event) { 
     var db = event.target.result; 
     var objectStore = db.createObjectStore("employee", {keyPath: "id"}); 

     for (var i in employeeData) { 
      objectStore.add(employeeData[i]); 
     } 
    } 

    function read() { 
     var transaction = db.transaction(["employee"]); 
     var objectStore = transaction.objectStore("employee"); 
     var request = objectStore.get("00-03"); 

     request.onerror = function(event) { 
      alert("Unable to retrieve daa from database!"); 
     }; 

     request.onsuccess = function(event) { 
      // Do something with the request.result! 
      if(request.result) { 
       alert("Name: " + request.result.name + ", Age: " + request.result.age + ", Email: " + request.result.email); 
      } 

      else { 
       alert("Kenny couldn't be found in your database!"); 
      } 
     }; 
    } 

    function readAll() { 
     var objectStore = db.transaction("employee").objectStore("employee"); 

     objectStore.openCursor().onsuccess = function(event) { 
      var cursor = event.target.result; 

      if (cursor) { 
       alert("Name for id " + cursor.key + " is " + cursor.value.name + ",\r\nAge: " + cursor.value.age + ",\r\nEmail: " + cursor.value.email); 
       cursor.continue(); 
      } 

      else { 
       alert("No more entries!"); 
      } 
     }; 
    } 

    function add() { 
     var request = db.transaction(["employee"], "readwrite") 
     .objectStore("employee") 
     .add({ id: "00-03", name: "Kenny", age: 19, email: "[email protected]" }); 

     request.onsuccess = function(event) { 
      alert("Kenny has been added to your database."); 
     }; 

     request.onerror = function(event) { 
      alert("Unable to add data\r\nKenny aready exist in your database! "); 
     } 
    } 

    function remove() { 
     var request = db.transaction(["employee"], "readwrite") 
     .objectStore("employee") 
     .delete("00-03"); 

     request.onsuccess = function(event) { 
      alert("Kenny's entry has been removed from your database."); 
     }; 
    } 

Jede Art von Hilfe wird sehr geschätzt.

Antwort

2

Nicht sicher, ob es hilft, aber es gibt ein paar Dinge:

  • Sie in der Regel nicht wollen, für in über ein Array verwenden. For..in dient zum Iterieren von Schlüsseln eines Objekts. Verwenden Sie für (var i = 0; i < arraylength; i ++) die Iteration über ein Array.
  • Die Klammern um den Objektspeicher wie in db.transaction (['store']) sind optional. Du brauchst sie nicht. In der Tat verwenden Sie sie inkonsistent, so dass Ihr Code schwer zu lesen ist.
  • Sie sollten die Variable 'var db' nicht so verwenden, wie Sie sie benutzen. Wenn Sie auf Entfernen klicken, ist die Verbindung möglicherweise null oder geschlossen.
  • Obwohl Sie können, würde ich empfehlen, keine Daten aus der onupgradeeneeded-Funktion einzufügen. Die erforderliche Upgrade-Funktion dient zum Erstellen oder Ändern Ihres Datenbankschemas. Sie sollten stattdessen eine andere Funktion verwenden. Wenn indexedDB diese andere Funktion direkt aufruft, ermittelt es automatisch, ob es zuerst upgradegradeded aufrufen und dann die Funktion ausführen muss.
  • Sie brauchen die Präfixe wie window.indexedDB = window.indexedDB || window.mozIndexedDB ... nicht mehr. Alle großen Browser, die indexedDB unterstützen, haben diese Präfixe gelöscht. Verwenden Sie einfach window.indexedDB
  • nicht sicher, warum Sie request.onerror sind Handling in nur einige Ihrer Funktionen
  • Sie brauchen keine globale Variablen mit ‚Fenster‘ Präfix. Zum Beispiel können Sie direkt indexedDB anstelle von window.indexedDB verwenden.
  • Sie möchten im Allgemeinen nicht im Kontext der Funktion readAll 'alert' aufrufen, die einen Cursor über den Speicher iteriert. Alarm blockiert. Die Cursor-Iteration ist asynchron.

Wie auch immer, meine beste Vermutung ist, dass irgendwie der Onclick-Handler für die Schaltfläche element.remove() ähnlich wie element.parentNode.removeChild(element) ruft. Versuchen Sie, die Remove-Funktion umzubenennen.

Versuchen Sie außerdem, einen zu entfernenden onerror-Handler hinzuzufügen, und überprüfen Sie auch, ob Sie nach dem Hinzufügen das Objekt im Objektspeicher in dev tools sehen können.

+0

Hallo! Vielen Dank für Ihre Antwort. Deine Vermutung scheint richtig zu sein und das Umbenennen hat es behoben. Auch über meinen Codierungsstil wurden die meisten Codes aus dem Tutorial kopiert und nur selbst ausprobiert. Ich nehme die Dinge zur Kenntnis, die Sie aufgelistet haben. – mtolingan