2016-06-22 17 views
1

このチュートリアルは、indexedDBを使用した単なるサンプルチュートリアルのブログで続きました。私はindexedDBで新しくなっているので、少し理解することができます。削除、機能の削除は動作していないようです

read、readAll、addなどの他の関数は正常に動作しています。機能の削除は機能していませんが。これらの機能は、ボタンを介してonclickと呼ばれています。

[データを削除]をクリックすると、ボタンが消えて何も起こりません。

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]lspoint.com" }, 
     { 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."); 
     }; 
    } 

ヘルプの任意の種類は非常に高く評価されます。

答えて

2

わからない、それは役立ちますが、いくつかの事がある場合:

  • あなたは、一般的に、アレイ上で使用する必要はありませんが。 For..inはオブジェクトのキーを反復するためのものです。 for(var i = 0; i < arraylength; i ++)を使用して配列を反復処理します。
  • db.transaction(['store'])のようなオブジェクトストアの括弧はオプションです。あなたはそれらを必要としません。実際にはコードを矛盾して使用しているため、コードを読みにくいです。
  • 変数 'var db'は、使用中に使用しないでください。 [削除]をクリックするまでに接続がnullまたは閉じている可能性があります。
  • できますが、私はonupgradeneeded関数内からデータを挿入しないことをお勧めします。アップグレードに必要な機能は、データベーススキーマを作成または変更するための機能です。代わりに、他の機能を使用する必要があります。その他の関数を直接呼び出すことで、indexedDBは最初にonregradeneededを呼び出して関数を実行する必要があるかどうかを自動的に判断します。
  • window.indexedDB = window.indexedDB || window.mozIndexedDB ...のような接頭辞はもう必要ありません。 indexedDBをサポートするすべての主要なブラウザは、これらの接頭辞を削除しました。ただ使用するwindow.indexedDB
  • あなたの関数の一部でrequest.onerrorを扱う理由がわからない
  • グローバル変数の前に「ウィンドウ」を付ける必要はありません。たとえば、window.indexedDBの代わりにindexedDBを直接使用することができます。
  • 一般的に、ストア上のカーソルを反復するreadAllの関数のコンテキスト内から 'alert'を呼び出すことは望ましくありません。警告がブロックされています。カーソル反復は非同期です。

はとにかく、私の最高の推測では、何らかの形で、ボタンのonclickハンドラはelement.parentNode.removeChild(element)に似element.remove()を呼び出していることです。 remove関数の名前を変更してみてください。

また、削除するonerrorハンドラを追加して、追加した後にオブジェクトがdevツールのオブジェクトストアにあることを確認してください。

+0

こんにちは!あなたの答えをありがとう。あなたの推測は正しいと思われ、それを修正して名前を変更しました。また、私のコーディングスタイルに関しては、コードのほとんどがチュートリアルのコピー貼り付けであり、自分で試してみました。あなたが列挙したことに注目します。 – mtolingan

関連する問題