尝试创建事务时DOM IDBDatabase异常11

时间:2012-08-20 09:23:41

标签: javascript html5 indexeddb

我正在使用最新的谷歌chrome ..我正在尝试实现HTML5 indexedDB示例。 AIM是在页面加载并在其中存储数据时创建数据库。如果有任何样本,请发布任何示例工作示例。 我尝试了这段代码,但是当我尝试创建一个事务时,我得到了Uncaught Error: InvalidStateError: DOM IDBDatabase Exception 11。 这是代码片段..

var idbRequest;
    var idb;
$(document).ready(function(){
    //ini----------------------
     var peopleData = [
                       { name: "John Dow", email: "john@company.com" },
                       { name: "Don Dow", email: "don@company.com" }
                   ];
    window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;
    window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
    window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
    //create database.............
    if (window.indexedDB) {
          idbRequest = window.indexedDB.open("StoreDB");
          idbRequest.onsuccess =  function(e) {
              idb = idbRequest.result || e.result;  // FF4 requires e.result. IDBRequest.request isn't set :(
          /*idbRequest.onerror = function (evt) {
                  console.log("IndexedDB error: " + evt.target.errorCode);
              };*/
              var v = '2.0';
                var setVrequest = idb.setVersion(v);
                setVrequest.onsuccess = function(e) {
                    if(idb.objectStoreNames.contains("Stores")) {
                        alert("ObjectStore is already created.");
                        return false;
                      }
                    var objectstore = idb.createObjectStore("Stores");
                    alert("Object store Created.");
                    if (!idb.objectStoreNames.contains('Stores')) {
                          alert("Object store doesn't exist.");
                        return;
                      }else{
                          alert("Object store contain 'store'");
                      }

                       // Create a transaction that locks the world.
                     var trans = idb.transaction(["Stores"],"readwrite");//getting exception on this line..
                     trans.oncomplete = function(){
                          console.log("Success transaction");
                        };
                        var objectStore = trans.objectStore("Stores");
                      var request = objectStore.put(
                          1,
                          "wsdsdsd");
                    alert("data added");
                };






            };


    }   
});

2 个答案:

答案 0 :(得分:3)

解决.. 我收到错误是因为在版本更改正在进行时我们无法创建事务。最终的工作答案是......

var idbRequest;
    var idb;
$(document).ready(function(){
    //ini----------------------

    window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB;
    window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange;
    window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;
    //create database.............
    if (window.indexedDB) {
          idbRequest = window.indexedDB.open("DB");
          idbRequest.onsuccess =  function(e) {
              idb = idbRequest.result || e.result;  // FF4 requires e.result. IDBRequest.request isn't set :(
          /*idbRequest.onerror = function (evt) {
                  console.log("IndexedDB error: " + evt.target.errorCode);
              };*/
              var v = '2.0';
                var setVrequest = idb.setVersion(v);
                setVrequest.onsuccess = function(e) {
                    if(idb.objectStoreNames.contains("Stores")) {
                        alert("ObjectStore is already created.");
                        var vertrans = setVrequest.result;
                        vertrans.oncomplete = doStuff;
                        return false;
                      }
                    var objectstore = idb.createObjectStore("Stores");
                    alert("Object store Created.");
                    if (!idb.objectStoreNames.contains('Stores')) {
                          alert("Object stores doesn't exist.");
                        return;
                      }else{
                          alert("Object store contain 'stores'");
                      } 
                    var vertrans = setVrequest.result;
                    vertrans.oncomplete = doStuff;
                };

            };


    }   
});

function doStuff(){
       // Create a transaction that locks the world.
    var trans = '';

         trans = idb.transaction(['Stores'],'readwrite');

     var objectStore = trans.objectStore('Stores');
      var request = objectStore.put(
          1,
          "wsdsdsd");
    alert("data added");
     trans.oncomplete = function(){
          console.log("Success transaction");
        };
}

答案 1 :(得分:0)

您可以在我的site找到有效的indexeddb示例。我正在使用我为indexeddb API编写的库linq2indexeddb。尝试一下,它将为您节省大量精力,使您的代码与crossborwser兼容。