2013-04-07 16 views
32

Come si può rimuovere un intero database IndexedDB da JavaScript, al contrario di un solo archivio oggetti? Sto usando il IndexedDB shim, che può utilizzare WebSQL come back-end.Come posso rimuovere un intero database IndexedDB da JavaScript?

Mi piacerebbe principalmente sapere come farlo per il browser PhantomJS (senza testa), sebbene Chrome, Safari (su iPad) e IE10 siano altri browser importanti.

+0

Semplicemente curioso. Perché vuoi rimuoverlo? – hequ

+1

@hequ Test di verifica automatici. – aknuds1

+0

possibile duplicato di [Come eliminare indexedDB in Chrome] (http://stackoverflow.com/questions/9384128/how-to-delete-indexeddb-in-chrome) – Josh

risposta

60

Per quanto posso dire, si dovrebbe usare 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"); 
}; 

posso confermare che funziona con PhantomJS 1.9.0 e Chrome 26.0.1410.43.

+2

Sì, è quello che vuoi, lo uso estensivamente nei test automatici per db.js - https://github.com/aaronpowell/db.js/blob/master/tests/specs/indexes.js#L15 –

+7

Dovresti aggiungere anche un handle per un evento bloccato: req.onblocked = function() {console.log ("deleteDatbase got blocked event"); } – dgrogan

0

Ho trovato che il codice seguente funziona correttamente ma per vedere il DB rimosso nella scheda Risorse di Chrome ho dovuto aggiornare la pagina. Inoltre, ho riscontrato problemi di esecuzione degli strumenti di debug di Chrome durante l'esecuzione delle transazioni. Rende più difficile il debug ma se lo si chiude durante l'esecuzione del codice, il codice sembra funzionare correttamente. Significativo è anche impostare un riferimento all'archivio oggetti quando si apre la pagina. Ovviamente la parte di cancellazione del codice è nel metodo deleteTheDB.

Codice derivato dall'esempio fornito da Craig Shoemaker su 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."); 

      }; 


     }; 

    } 
} 
Problemi correlati