Start · Sprachen · JavaScript · Referenz · IDBFactory.deleteDatabase()

IDBFactory.deleteDatabase()

Methode

Fordert die asynchrone Löschung einer IndexedDB-Datenbank an und gibt ein <code>IDBOpenDBRequest</code> zurück, das über Erfolg, Fehler oder Blockierung informiert.

seit JavaScript Baseline: alle Browser (seit 2015) Kategorie: webapi

Signatur

IDBFactory.prototype.deleteDatabase(name)

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.result ist undefined. 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 dem versionchange-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

Typ
IDBOpenDBRequest
Beschreibung
Ein Request-Objekt, das die Ereignisse 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.');
};
Datenbank gelöscht

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();
Lokale Nutzerdaten entfernt

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');
};
Verbindung geschlossen, newVersion: null 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();
2 Datenbank(en) gelöscht

// Wichtig · Fallstricke

  • Kein Existenz-Check: success wird auch ausgelöst, wenn die Datenbank nie existiert hat. Um zu prüfen, ob sie existiert, nutzen Sie vorher indexedDB.databases().
  • Blockierung: Nach blocked ist die Anfrage nicht abgebrochen. Sie wartet und wird fertig, sobald alle Verbindungen geschlossen sind. Ohne onversionchange-Handler mit db.close() in anderen Tabs kann das beliebig lange dauern.
  • Eigene Verbindung: Schließen Sie Ihre eigene IDBDatabase-Instanz mit db.close(), bevor Sie löschen. Sonst blockiert Ihre eigene Verbindung das Löschen, falls sie nicht auf versionchange reagiert.
  • Unwiderruflich: Alle Daten sind danach weg. Vorher bei Bedarf sichern.
  • Kontext: Die Methode wirft einen SecurityError in Kontexten ohne Speicherzugriff, z. B. bei data:-URLs, in manchen privaten Modi oder in Iframes von Drittanbietern mit Speicherpartitionierung bzw. Speicher-Sperre.
  • Der zweite Parameter options ist nicht standardisiert und veraltet. Moderne Browser ignorieren ihn.
  • Verfügbar in Fenstern und Web Workern (self.indexedDB). Unterstützt von allen aktuellen Browsern.