2013-04-07 13 views
32

Jak można usunąć całą bazę danych IndexedDB z JavaScript, a nie tylko magazyn obiektów? Używam IndexedDB shim, która może używać WebSQL jako zaplecza.Jak mogę usunąć całą bazę danych IndexedDB z JavaScript?

Chciałbym przede wszystkim wiedzieć, jak to zrobić dla przeglądarki PhantomJS (bezgłowy), chociaż Chrome, Safari (na iPada) i IE10 to inne ważne przeglądarki.

+0

Po prostu ciekawi. Dlaczego chcesz go usunąć? – hequ

+1

@hequ Zautomatyzowane cele testowania. – aknuds1

+0

możliwy duplikat [Jak usunąć indexedDB w Chrome] (http://stackoverflow.com/questions/9384128/how-to-delete-indexeddb-in-chrome) – Josh

Odpowiedz

60

O ile mogę powiedzieć, należy użyć 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"); 
}; 

Mogę potwierdzić, że działa z PhantomJS 1.9.0 i Chrome 26.0.1410.43.

+2

Tak, tego właśnie chcesz. Używam go w automatycznych testach dla db.js - https://github.com/aaronpowell/db.js/blob/master/tests/specs/indexes.js#L15 –

+7

Powinieneś również dodaj uchwyt dla zablokowanego zdarzenia: req.onblocked = function() {console.log ("deleteDatbase has blocked events"); } – dgrogan

0

Znalazłem następujący kod działa OK, ale aby zobaczyć DB usunięte na karcie Zasoby Chrome musiałem odświeżyć stronę. Zauważyłem też, że miałem problemy z narzędziami do debugowania Chrome działającymi podczas wykonywania transakcji. Utrudnia to debugowanie, ale jeśli zamkniesz go podczas działania kodu, kod wydaje się działać poprawnie. Istotne jest również ustawienie odwołania do składnicy obiektów podczas otwierania strony. Oczywiście, usuń część kodu jest w metodzie deleteTheDB.

Kod wyprowadzony z przykładu dostarczonego przez Craiga Shoemakera na 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."); 

      }; 


     }; 

    } 
} 
Powiązane problemy