IndexedDB DOM IDBDatabase例外11即使在使用oncomplete之后也是如此

时间:2013-04-30 16:19:23

标签: javascript html5 google-chrome indexeddb

我是IndexedDB Concepts的新手。我试图在IndexedDB中存储电影列表并检索它。但由于某些原因,当我尝试检索它时,Chrome浏览器中有一个DOM IDBDatabase异常11。我尝试使用简单的警报来检索它。我还尝试通过将警报放在onComplete事件中来检索数据,但这似乎也是失败的。有人可以让我知道我在做什么错。以下是我的代码。

const dbName = "movies";
var request = indexedDB.open(dbName, 1);
request.onerror = function(event) {
    alert("Seems like there is a kryptonite nearby.... Please Check back later");
};

request.onsuccess = function(event) {
    var db = event.target.result;
var transaction = db.transaction(["movies"],"readwrite");
var objectStore = transaction.objectStore("movies");
var request1 = objectStore.get("1");
request1.result.oncomplete=function(){
alert("The movie is"+request1.result.name);//This is the place where i get the error
}
};

request.onupgradeneeded = function(event) {
    db = event.target.result;
    var objectStore = db.createObjectStore("movies", { keyPath: "movieid" });
    objectStore.createIndex("name", "name", { unique: false });
    objectStore.createIndex("runtime", "runtime", { unique: false });
    for (var i in movieDataToStore) {
objectStore.add(movieDataToStore[i]);
}};

2 个答案:

答案 0 :(得分:1)

我仍然不知道最后一个程序出了什么问题。我重写了上面的程序,它就像一个魅力。这是代码。希望这可以帮助任何坚持这个问题的人。如果有人在最​​后一次弄清楚出了什么问题,请分享你的想法。

var db; //database will be stored in this value when success is called
var movieDataToStore = [{ movieid: "1", name: "Keep my Storage Local", runtime:"60"},
            { movieid: "2", name: "Rich Internet Conversations", runtime:"45"},
            { movieid: "3", name: "Applications of the Rich and Famous", runtime:"30"},
            { movieid: "4", name: "All Jump All eXtreme", runtime:"45"}];

window.query = function() {
    db.transaction("movies").objectStore("movies").get("1").onsuccess = function(event) {
        alert("QUERY: CThe first movie is" + event.target.result.name);
    };};

window.onload = function() {
    if (!window.indexedDB) {
        window.alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.")
    }
else{
    var request = indexedDB.open("movies", 1);
    request.onerror = function(event) {
          alert("Seems like there is a kryptonite nearby.... Please Check back later");
};

    request.onsuccess = function(event) {
    db = this.result;
    query();
    };

    request.onupgradeneeded = function(event) {
         var db = event.target.result;
         if(db.objectStoreNames.contains("movies")) {
              db.deleteObjectStore("movies");
            }
         var objectStore = db.createObjectStore("movies", { keyPath: "movieid"});
         objectStore.createIndex("name", "name", { unique: false });
          objectStore.createIndex("runtime", "runtime", { unique: false });
          for (var i in movieDataToStore) {
                objectStore.add(movieDataToStore[i]);
              }
    };

        }   
};

答案 1 :(得分:1)

  1. 我认为在onupgradeneeded上下文中插入数据是不好的做法。您应该在其他时间以不相关的功能单独执行此操作。实际上,尝试将数据插入自上次加载页面后版本增加的数据库将自动触发升级所需的事件。
  2. 虽然许多在线示例将数据库连接句柄(您的db var)推入某个全局范围变量,但这也是一种不良做法,会导致错误。仅访问回调中的db var作为参数。换句话说,openRequest.onsuccess函数应该将db变量传递给查询函数。这也减少了以后任何垃圾收集问题的机会,并使数据库连接保持打开状态(indexedDB的设计者允许这样做,但通常应该避免)。
  3. 如果你的电影ID是整数,我不清楚你为什么要存储它们并将它们作为字符串检索。您可以存储整数值。您可以将整数传递给store.get。
  4. 您正在使用......不恰当。它将起作用,但是对于... in用于循环对象文字的键(如var x = {key:value})。使用普通for循环或在迭代影片阵列时使用array.foreach。
  5. 正如您在固定代码中发现的那样,最好使用request.onsuccess和request.onerror。还有一个transaction.oncomplete。但我不确定是否有request.oncomplete。发生的事情是你正在设置IDBRequestObject的oncomplete属性,但由于代码永远不会触发它,所以什么都不做。
  6. DOM 11通常表示您尝试访问不存在或处于错误状态的表。通常这是由于其他地方的错误而发生的,例如onupgradeneeded在连接时永远不会被调用。这很令人困惑,但考虑到代码的设置方式,基本上db会在你的页面第一次加载时创建,但是永远不会再次创建,所以在开发时,如果你做了更改,但是没有增加db版本,那么你永远不会见到他们。