2013-04-07 11 views
32

Wie kann man eine ganze IndexedDB-Datenbank von JavaScript im Gegensatz zu nur einem Objektspeicher entfernen? Ich verwende die IndexedDB shim, die WebSQL als Back-End verwenden kann.Wie kann ich eine ganze IndexedDB-Datenbank aus JavaScript entfernen?

Ich würde gerne wissen, wie dies für den PhantomJS (kopflosen) Browser zu tun, obwohl Chrome, Safari (auf dem iPad) und IE10 andere wichtige Browser sind.

+0

Nur neugierig sein. Warum willst du es entfernen? – hequ

+1

@hequ Automatisierte Testzwecke. – aknuds1

+0

mögliches Duplikat von [So löschen Sie indexedDB in Chrome] (http://stackoverflow.com/questions/9384128/how-to-delete-indexeddb-in-chrome) – Josh

Antwort

60

Soweit ich das beurteilen kann, sollte man indexedDB.deleteDatabase verwenden:

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"); 
}; 

Ich kann bestätigen, dass es mit PhantomJS 1.9.0 und Chrome 26.0.1410.43 funktioniert.

+2

Ja, das ist, was Sie wollen, ich verwende es ausgiebig in den automatisierten Tests für db.js - https://github.com/aaronpowell/db.js/blob/master/tests/specs/indexes.js#L15 –

+7

Sie sollten Fügen Sie außerdem ein Handle für ein blockiertes Ereignis hinzu: req.onblocked = function() {console.log ("deleteDatbase wurde blockiert"); } – dgrogan

0

Ich habe festgestellt, dass der folgende Code funktioniert OK, aber um die DB in der Registerkarte "Chrome Resources" zu entfernen, musste ich die Seite aktualisieren. Außerdem habe ich Probleme mit den Chrome-Debug-Tools, die während der Ausführung von Transaktionen ausgeführt werden. Macht es schwieriger zu debuggen, aber wenn Sie es während der Ausführung von Code schließen, scheint der Code OK zu funktionieren. Wichtig ist auch, einen Verweis auf den Objektspeicher beim Öffnen der Seite festzulegen. Offensichtlich ist der Lösch-Teil des Codes in der DeleteTheDB-Methode.

Code abgeleitet von Beispiel von Craig Shoemaker auf Pluralsight zur Verfügung gestellt.

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."); 

      }; 


     }; 

    } 
}