0

我对 IndexedDB 概念很陌生。我正在尝试在 IndexedDB 中存储电影列表并检索它。但是由于某种原因,当我尝试检索它时,chrome 浏览器中有一个 DOM IDBDatabase Exception 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]);
}};
4

2 回答 2

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

        }   
};
于 2013-04-30T20:09:26.753 回答