0

コードに問題があるので、助けていただければ幸いです。.open とそれに続くすべてのコード (unupgradeneede、onsuccess、onerror aso) を js ファイルに入れ、それを別の js ファイルから呼び出します。しかし、IndexedDB を開いてオブジェクト ストアを作成するコードは実行されないようです。これがコードです

window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB ||    window.msIndexedDB;

contosoData = {

    db: null,

    useDb: function (successCallback) {
        var request = window.indexedDB.open("ContosoData", 2);

        request.onsuccess = function (e) {
            contosoData.db = request.result;
            console.log('indexeddb.success');
            successCallback();
        };

        request.onupgradeneeded = function (e) {
            console.log('indexeddb.upgradeneeded');

            contosoData.db = e.target.result;
            if (contosoData.db.objectStoreNames.contains("bookingStore")) {
                contosoData.db.deleteObjectStore("bookingStore");
                var bookingStore = contosoData.db.createObjectStore("bookingsStore", { keyPath: "id", autoIncrement: true });
                bookingStore.createIndex = ('title', 'title', { unique: false });
                bookingstore.createIndex = ('id', 'id', { unique: true });
            }

            else if (contosoData.db.objectStoreNames.contains("workerStore")) {
                contosoData.db.deleteObjectStore("workerStore");
                var workerStore = contosoData.db.createObjectStore("workerStore", { keyPath: "employeeNr" });
            }

            else if (contosoData.db.objectStoreNames.contains("customerStore")) {
                contosoData.db.deleteObjectStore("customerStore");
                var customerStore = contosoData.db.createObjectStore("customerStore", { keyPath: "orgNr" });
            }

            var machineStore = contosoData.db.objectStoreNames.contains("machineStore", { keyPath: "machineNr" });
            contosoData.db.deleteObjectStore("machineStore");
            var machineStore = contosoData.db.createObjectStore("machineStore");
        };

        request.onerror = function (e) {
            console.log('indexeddb.onerror: ' + e);
        };
        request.onblocked = function (e) {
            console.log('indexeddb.locked');
        };
    }
};

contosoData.useDb(function (db) {
    var transaction = contosoData.db.transaction(['bookingsStore'], 'readwrite');
    var objectStore = transaction.objectStore('bookingsStore');
    console.log(objectStore.name);
});

そして、それを実行しようとすると、他のjsファイルでトランザクションを作成しようとすると、未定義のトランザクションが発生します... IndexedDBを開く関数を含むjsファイルがリンクされていることを確認しました正しい方法と順序で html ファイルに追加します。また、いくつかのブレークポイントを配置しましたが、useDb コードが実行されないようです。これがコードです

function init() {

    contosoData.useDb();

    calendar.createCalendar();
}


calendar.createCalendar = function () {

    var transaction = contosoData.db.transaction(["bookingStore"], "readwrite");
    var bookingStore = transaction.objectStore("bookingStore");
}

足りないものはありますか?私はそれを検索し、解決策を見つけようとしましたが、これまでのところ成功していません...

4

2 に答える 2

0

こんなものだろうか

function init() {

    calendar.createCalendar();
}


calendar.createCalendar = function () {

    var transaction = contosoData.db.transaction(["bookingStore"], "readwrite");
    var bookingStore = transaction.objectStore("bookingStore");
}


contosoData.useDb(init);
于 2013-02-08T13:15:03.077 に答える
0

あなたのコードにはすでに 2 つの問題があります。

まず、データベースは常にバージョン 2 を使用して開かれます。バージョン 2 のデータベースが既にある場合は、onupgradeneeded イベントをトリガーすることはありません。最初にそれを確認する必要があります (つまり、Chrome では、Ctrl-Shift-I を押して [リソース] の下を調べます)。

第二に、コードはこのロジックを使用します

if (contosoData.db.objectStoreNames.contains("bookingStore")) {
                contosoData.db.deleteObjectStore("bookingStore");
                var bookingStore = contosoData.db.createObjectStore("bookingsStore", { keyPath: "id", autoIncrement: true });
                bookingStore.createIndex = ('title', 'title', { unique: false });
                bookingstore.createIndex = ('id', 'id', { unique: true });
            }

空のデータベースの場合、確実にオブジェクト ストアがないため、if ブロックは常に false と評価されます。オブジェクト ストアは、常に false の if ブロックに存在するため、作成されることはありません。

于 2013-02-11T22:45:38.517 に答える