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 変数) を何らかのグローバル スコープ変数に押し込んでいますが、これは後でエラーにつながる悪い習慣でもあります。パラメータとしてコールバック内の 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 に答える