Signatur
Beschreibung
Mit indexedDB.deleteDatabase(name) löschen Sie eine komplette IndexedDB-Datenbank mit allen Object Stores, Indizes und Daten. Das ist nützlich beim Abmelden eines Nutzers, beim Zurücksetzen eines Offline-Caches, beim Wechsel auf ein ganz neues Schema oder in Tests, die mit einer leeren Datenbank beginnen sollen.
Die Methode arbeitet asynchron. Sie gibt sofort ein IDBOpenDBRequest zurück, an dem Sie auf Ereignisse reagieren:
success: Die Datenbank wurde gelöscht.request.resultistundefined. Dieses Ereignis tritt auch dann auf, wenn es gar keine Datenbank mit diesem Namen gab.error: Das Löschen ist fehlgeschlagen, z. B. weil der Speicherzugriff verweigert wurde.blocked: Andere Verbindungen zur Datenbank sind noch offen und wurden nach demversionchange-Ereignis nicht geschlossen. Das Löschen wartet, bis alle Verbindungen geschlossen sind.
Bevor gelöscht wird, schickt der Browser an alle offenen Verbindungen (auch in anderen Tabs) ein versionchange-Ereignis mit newVersion === null. Gut geschriebene Anwendungen rufen in diesem Handler db.close() auf, damit das Löschen nicht blockiert wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Name der zu löschenden Datenbank. Groß- und Kleinschreibung wird beachtet. | |
| $options | object | Nicht standardisiert, veraltet (nur ältere Firefox-Versionen): Objekt mit storage ("persistent" oder "temporary"). Nicht verwenden. |
Rückgabewert
success, error und blocked auslöst. Bei Erfolg ist result gleich undefined.Beispiele
Datenbank mit Ereignis-Handlern löschen
const request = indexedDB.deleteDatabase('app-cache');
request.onsuccess = () => {
console.log('Datenbank gelöscht');
};
request.onerror = () => {
console.error('Fehler beim Löschen:', request.error);
};
request.onblocked = () => {
console.warn('Löschen blockiert: Bitte andere Tabs schließen.');
};
Als Promise kapseln und beim Abmelden verwenden
const deleteDB = (name) =>
new Promise((resolve, reject) => {
const req = indexedDB.deleteDatabase(name);
req.onsuccess = () => resolve();
req.onerror = () => reject(req.error);
req.onblocked = () => console.warn(`"${name}" wird noch von einer Verbindung genutzt …`);
});
const logout = async () => {
await deleteDB('user-data');
console.log('Lokale Nutzerdaten entfernt');
};
logout();
Offene Verbindungen bei versionchange schließen
const openReq = indexedDB.open('notes', 1);
openReq.onupgradeneeded = () => {
openReq.result.createObjectStore('notes', { keyPath: 'id' });
};
openReq.onsuccess = () => {
const db = openReq.result;
// Wird ausgelöst, wenn irgendwo deleteDatabase() oder ein Upgrade angefordert wird
db.onversionchange = (event) => {
db.close();
console.log('Verbindung geschlossen, newVersion:', event.newVersion);
};
// Jetzt löschen – wird nicht blockiert, da die Verbindung sich selbst schließt
const delReq = indexedDB.deleteDatabase('notes');
delReq.onsuccess = () => console.log('notes gelöscht');
};
Alle Datenbanken einer Origin löschen
const clearAllDatabases = async () => {
const dbs = await indexedDB.databases();
await Promise.all(
dbs.map(({ name }) => new Promise((resolve, reject) => {
const req = indexedDB.deleteDatabase(name);
req.onsuccess = resolve;
req.onerror = () => reject(req.error);
}))
);
console.log(`${dbs.length} Datenbank(en) gelöscht`);
};
clearAllDatabases();
// Wichtig · Fallstricke
- Kein Existenz-Check:
successwird auch ausgelöst, wenn die Datenbank nie existiert hat. Um zu prüfen, ob sie existiert, nutzen Sie vorherindexedDB.databases(). - Blockierung: Nach
blockedist die Anfrage nicht abgebrochen. Sie wartet und wird fertig, sobald alle Verbindungen geschlossen sind. Ohneonversionchange-Handler mitdb.close()in anderen Tabs kann das beliebig lange dauern. - Eigene Verbindung: Schließen Sie Ihre eigene
IDBDatabase-Instanz mitdb.close(), bevor Sie löschen. Sonst blockiert Ihre eigene Verbindung das Löschen, falls sie nicht aufversionchangereagiert. - Unwiderruflich: Alle Daten sind danach weg. Vorher bei Bedarf sichern.
- Kontext: Die Methode wirft einen
SecurityErrorin Kontexten ohne Speicherzugriff, z. B. beidata:-URLs, in manchen privaten Modi oder in Iframes von Drittanbietern mit Speicherpartitionierung bzw. Speicher-Sperre. - Der zweite Parameter
optionsist nicht standardisiert und veraltet. Moderne Browser ignorieren ihn. - Verfügbar in Fenstern und Web Workern (
self.indexedDB). Unterstützt von allen aktuellen Browsern.