如何从 JavaScript 中删除整个 IndexedDB 数据库?

Posted

技术标签:

【中文标题】如何从 JavaScript 中删除整个 IndexedDB 数据库?【英文标题】:How can I remove a whole IndexedDB database from JavaScript? 【发布时间】:2013-03-29 12:05:21 【问题描述】:

如何从 javascript 中删除整个 IndexedDB 数据库,而不仅仅是一个对象存储?我正在使用IndexedDB shim,它可能使用 WebSQL 作为其后端。

我主要想知道如何为 PhantomJS(无头)浏览器执行此操作,尽管 Chrome、Safari(iPad 上)和 IE10 是其他重要的浏览器。

【问题讨论】:

只是好奇。为什么要删除它? @hequ 自动化测试目的。 How to delete indexedDB in Chrome的可能重复 @Josh 但是这个问题是关于如何手动删除数据库,而这是关于以编程方式删除它?此外,它还专门针对 Chrome。 我理解问题是一样的。答案基本相同。但是好的,投票撤回。 【参考方案1】:

据我所知,应该使用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");
;

我可以确认它适用于 PhantomJS 1.9.0 和 Chrome 26.0.1410.43。

【讨论】:

是的,这就是你想要的,我在 db.js 的自动化测试中广泛使用它 - github.com/aaronpowell/db.js/blob/master/tests/specs/… 有没有办法在不知道其名称的情况下对来源上的所有数据库执行此操作? 如果您已经打开,则必须在删除之前调用 db.close()。否则你会得到 onblocked 事件developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/close @iX3 您可以致电indexedDB.databases() 获取所有数据库的列表,更多信息请访问developer.mozilla.org/en-US/docs/Web/API/IDBFactory/databases @TomSaleeba 感谢您的提示 - 看起来像是规范草案,但我会在那里关注未来的更新。【参考方案2】:

我发现以下代码可以正常工作,但要在 Chrome 资源选项卡中看到删除的数据库,我必须刷新页面。 我还发现我在进行交易时运行的 Chrome 调试工具有问题。使调试变得更加困难,但是如果您在运行代码时关闭它,代码似乎可以正常工作。 重要的还有在打开页面时设置对对象存储的引用。 显然delete部分代码在deleteTheDB方法中。

代码源自 Craig Shoemaker 在 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.");

            ;


        ;

    

【讨论】:

以上是关于如何从 JavaScript 中删除整个 IndexedDB 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

无法删除 localStorage 数组项

如何使用列号从 MySQL 中的表中删除列

如何从 React Typescript 的整个项目中删除未使用的导入/声明?

如何从整个页面asp.net c#中删除类名

如何删除div中的div和所有元素? Javascript,html,css

JavaScript如何从数组中删除特定数据