web-dev-qa-db-fra.com

Comment puis-je supprimer une base de données IndexedDB entière de JavaScript?

Comment supprimer une base de données IndexedDB entière de JavaScript, par opposition à un simple magasin d'objets? J'utilise le indexedDB shim , qui peut utiliser WebSQL comme backend.

J'aimerais principalement savoir comment faire cela pour le navigateur PhantomJS (sans tête), bien que Chrome, Safari (sur iPad) et IE10 soient d'autres navigateurs importants.

38
aknuds1

Pour autant que je sache, il faut utiliser indexedDB.deleteDatabase :

var req = indexedDB.deleteDatabase(databaseName);
req.onsuccess = function () {
    console.log("Deleted database successfully");
};
req.onerror = function () {
    console.log("Couldn't delete database");
};
req.onblocked = function () {
    console.log("Couldn't delete database due to the operation being blocked");
};

Je peux confirmer que cela fonctionne avec PhantomJS 1.9.0 et Chrome 26.0.1410.43.

67
aknuds1

J'ai trouvé que le code suivant fonctionne bien, mais pour voir la base de données supprimée dans l'onglet Chrome Resources, j'ai dû actualiser la page. J'ai également constaté que j'avais des problèmes avec le Chrome outils de débogage en cours d'exécution lors des transactions. Rend le débogage plus difficile, mais si vous le fermez pendant l'exécution du code, le code semble fonctionner correctement. Il est également important de définir une référence au magasin d'objets lors de l'ouverture de la page. Évidemment, la suppression une partie du code se trouve dans la méthode deleteTheDB.

Code dérivé d'un exemple fourni par Craig Shoemaker sur Pluralsight.

var IndDb = {
    name: 'SiteVisitInsp',
    version: 1000,
    instance: {},
    storenames: {
        inspRecords: 'inspRecords',
        images: 'images'
    },
    defaultErrorHandler: function (e) {
        WriteOutText("Error found : " + e);
    },
    setDefaultErrorHandler: function (request) {
        if ('onerror' in request) {
            request.onerror = db.defaultErrorHandler;
        }
        if ('onblocked' in request) {
            request.onblocked = db.defaultErrorHandler;
        }
    }

};

var dt = new Date();
var oneInspRecord =
        {            
            recordId: 0,
            dateCreated: dt,
            dateOfInsp: dt,
            weatherId: 0,
            timeArrived: '',
            timeDeparted: '',
            projectId: 0,
            contractorName: '',
            DIWConsultant: '',
            SiteForeman: '',
            NoOfStaffOnSite: 0,
            FileME: '',
            ObservationNotes: '',
            DiscussionNotes: '',
            MachineryEquipment: '',
            Materials: ''
        };

var oneImage =
{
    recordId: '',
    imgSequence: 0,
    imageStr: '',
    dateCreated: dt
}


var SVInsp = {
    nameOfDBStore: function () { alert("Indexed DB Store name : " + IndDb.name); },
    createDB: function () {
        openRequest = window.indexedDB.open(IndDb.name, IndDb.version);

        openRequest.onupgradeneeded = function (e) {
            var newVersion = e.target.result;
            if (!newVersion.objectStoreNames.contains(IndDb.storenames.inspRecords)) {
                newVersion.createObjectStore(IndDb.storenames.inspRecords,
                    {
                        autoIncrement: true

                    });
            }

            if (!newVersion.objectStoreNames.contains(IndDb.storenames.images)) {
                newVersion.createObjectStore(IndDb.storenames.images,
                    {
                        autoIncrement: true
                    });
            }
        };

        openRequest.onerror = openRequest.onblocked = 'Error'; //resultText;

        openRequest.onsuccess = function (e) {
            //WriteOutText("Database open");
            IndDb.instance = e.target.result;
        };

    },

    deleteTheDB: function () {
        if (typeof IndDb.instance !== 'undefined') {
            //WriteOutText("Closing the DB");

            IndDb.instance.close();
            var deleteRequest = indexedDB.deleteDatabase(IndDb.name)

            deleteRequest.onblocked = function () {
                console.log("Delete blocked.");
            }

            deleteRequest.onerror =
                function () {
                    console.log("Error deleting the DB");
                    //alert("Error deleting the DB");
                };
                //"Error deleting the DB";

            deleteRequest.onsuccess = function () {

                console.log("Deleted OK.");
                alert("*** NOTE : Requires page refresh to see the DB removed from the Resources IndexedDB tab in Chrome.");
                //WriteOutText("Database deleted.");

            };


        };

    }
}
0
CYoung