1

使用 HTML5 代码,我创建了以下数据库,能够对数据库进行创建、添加、删除和打印操作。但是,每次我加载 html 页面时都会创建 ObjectStore,并且在我重新加载页面时不存在存储的附加值。代码有什么问题?请帮忙。谢谢。

 <html>
    <title>
    IndexedDB</title>
    <script type="text/javascript">
    var indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;
    var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
    var db;
    //var test;
    var dbVersion = 1;

    (function () {

    var Cust_Data = [{name: "ABC", email: "abc@gmail.com"}, 
                    {name: "XYZ", email: "xyz@gmail.com"}];

    function initializeDB(){
            alert("At initialize DB function");
            var request = indexedDB.open("Customers",dbVersion);

            request.onerror = function(event){
                write("Database cannot be opened:" + event.target.errorCode);
            };

            request.onsuccess = function(event){
                db = event.target.result;
                if (db.setVersion) {
                    if (db.version != dbVersion) {
                        var req = db.setVersion(dbVersion);
                        req.onerror = db.onerror;
                        req.onsuccess = function () {
                            if(db.objectStoreNames.contains("CustDetails")) {
                                alert("CustDetails store already present!");
                            }
                            else{
                            //alert("Initialize else function");
                            var objectStore = db.createObjectStore("CustDetails",{ Keypath: "AadharNumber", autoIncrement: true });
                            objectStore.createIndex("name", "name",{unique: false});
                            objectStore.createIndex("email", "email",{unique: true});

                            for(i in Cust_Data){
                                objectStore.add(Cust_Data[i]);
                            }
                            }
                        };
                    }
                    else{
                        alert("Not created ObjectStore");   
                    }
                }
            };
    }       

    function contentLoaded(){
        alert("At contentLoaded function");
        initializeDB();
        //db = initializeDB();
        //db = test.indexedDB.db;
        alert("Value of db in contentLoaded function is :" + db);
        var btnAdd = document.getElementById("btnAdd");
        var btnDelete = document.getElementById("btnDelete");
        var btnPrint = document.getElementById("btnPrint");

        btnAdd.addEventListener("click", function(){
                alert("At add function");
                //alert("Value of db in add function is :" + db);
                var name = document.getElementById("txtName").value;
                var email = document.getElementById("txtEmail").value;
                var transaction = db.transaction("CustDetails",IDBTransaction.READ_WRITE);
                //alert("Transaction statement passed");
                var objectStore = transaction.objectStore("CustDetails");
                var request = objectStore.add({name: name, email: email});
                request.onsuccess = function(event){
                alert ( "Added to the database");
                document.getElementById("txtName").value = "";
                document.getElementById("txtEmail").value = "";
            };

        },false);

        btnDelete.addEventListener("click", function(){
            //alert("At Delete function");
            //var AadharNumber = document.getElementById("AadharNumber").value;
            var AadharNumber =  parseInt(document.getElementById("AadharNumber").value);
            var transaction = db.transaction("CustDetails",IDBTransaction.READ_WRITE);
            var objectStore = transaction.objectStore("CustDetails");
            var request = objectStore.delete(AadharNumber);
            request.onsuccess = function(event){
                alert( "Aadhar Number: "+ AadharNumber + " deleted from the database");
            };

        },false);

        btnPrint.addEventListener("click", function () {
                        var output = document.getElementById("printOutput");
                        output.textContent = "";
                        var transaction = db.transaction("CustDetails", IDBTransaction.READ_WRITE);
                        var objectStore = transaction.objectStore("CustDetails");
                        var request = objectStore.openCursor();
                        request.onsuccess = function(event) {  
                            var cursor = event.target.result;  
                            if (cursor) {  
                                output.textContent += "Aadhar Number: " + cursor.key + " is " + cursor.value.name + "";
                                cursor.continue();  

                            }  
                            else {  
                                console.log("No more entries!");  
                            }  
                        };  
                    }, false); 
    }

    window.addEventListener("DOMContentLoaded", contentLoaded, false); 
    }
    )();

    </script>
    <body><center>
    <div id="container">
        <label for="txtName">
        Name:
        </label>
        <input type="text" id="txtName" name="txtName" />
        <br />
        <label for="txtEmail">
        Email:
        </label>
        <input type="text" id="txtEmail" name="txtEmail" />
        <br />
        <input type="button" id="btnAdd" value="Add Record" />
        <br />
        <label for="AadharNumber">
        ID:
        </label>
        <input type="text" id="AadharNumber" name="txtAadharNumber" />
        <input type="button" id="btnDelete" value="Delete Record" />
        <br />
        <input type="button" id="btnPrint" value="Print Records" />
        <br />
        <output id="printOutput" > </output>
    </div>  
    </center>
    </body>
    </html>
4

1 回答 1

1

使用旧版本的规范 (setVersion) 时,数据库的版本是一个字符串值。这就是每次加载时都会创建对象存储的原因。我会建议你把以下内容:

if (db.setVersion) {
    if (parseInt(db.version) != dbVersion) {
        // Create the structure
    }
}

请注意,此实现仅适用于较旧的 Firefox 和 chrome 浏览器。在较新版本的浏览器中,open 方法有一个 onupgradeneeded 回调。有关它的更多信息,请查看此处

function initializeDB(){             
   var request = indexedDB.open("Customers",dbVersion);              
   request.onerror = function(event){ }; 
   request.onsuccess = function(event){ };
   request.onupgradeneeded = function (e){
      if(e.newVersion == dbVersion){
         var db = e.result;
         if(!db.objectStoreNames.contains("CustDetails")) {
             var objectStore = db.createObjectStore("CustDetails",{ Keypath: "AadharNumber", autoIncrement: true });                                     
             objectStore.createIndex("name", "name",{unique: false});                                 
             objectStore.createIndex("email", "email",{unique: true});

             // ....    
         }
      }
   };
于 2012-10-17T09:29:56.403 回答