Start · Sprachen · JavaScript · Referenz · IDBDatabase.deleteObjectStore()

IDBDatabase.deleteObjectStore()

Methode

Löscht den Objektspeicher mit dem angegebenen Namen samt aller Datensätze und Indizes; nur innerhalb einer <code>versionchange</code>-Transaktion erlaubt.

seit JavaScript Baseline: alle Browser (IndexedDB 1.0) Kategorie: webapi

Signatur

IDBDatabase.prototype.deleteObjectStore(name)

Beschreibung

Mit deleteObjectStore() entfernt man einen Objektspeicher (Object Store) dauerhaft aus einer IndexedDB-Datenbank. Dabei werden alle gespeicherten Datensätze und alle Indizes dieses Speichers mitgelöscht. Die Methode ist das Gegenstück zu IDBDatabase.createObjectStore().

Wie alle Änderungen am Datenbankschema darf die Methode nur innerhalb einer versionchange-Transaktion aufgerufen werden, also im Handler des upgradeneeded-Events von indexedDB.open(). Dafür muss die Datenbank mit einer höheren Versionsnummer geöffnet werden als die aktuell gespeicherte.

Typische Einsatzfälle sind Schemamigrationen: Ein veralteter Speicher wird entfernt, umbenannt (durch Neuanlage und Kopieren der Daten) oder mit geänderten Schlüsseleinstellungen (keyPath, autoIncrement) neu erzeugt – diese lassen sich nachträglich nicht ändern.

Parameter

Name Typ Default Beschreibung
$name Pflicht string Name des zu löschenden Objektspeichers. Muss exakt (Groß-/Kleinschreibung beachten) einem vorhandenen Speicher entsprechen.

Beispiele

Veralteten Objektspeicher bei einem Upgrade entfernen

const request = indexedDB.open('shop', 3);

request.onupgradeneeded = (event) => {
  const db = event.target.result;

  // Nur löschen, wenn der Speicher existiert – sonst NotFoundError
  if (db.objectStoreNames.contains('tempCart')) {
    db.deleteObjectStore('tempCart');
    console.log('tempCart gelöscht');
  }
};

request.onsuccess = () => {
  const db = request.result;
  console.log([...db.objectStoreNames]);
};
tempCart gelöscht ["orders", "products"]

Speicher mit geändertem keyPath neu anlegen

const request = indexedDB.open('notes', 2);

request.onupgradeneeded = (event) => {
  const db = event.target.result;

  // keyPath kann nicht geändert werden → löschen und neu erzeugen
  if (db.objectStoreNames.contains('notes')) {
    db.deleteObjectStore('notes');
  }
  const store = db.createObjectStore('notes', { keyPath: 'uuid' });
  store.createIndex('byDate', 'createdAt');
};

Versionsbasierte Migration mit Promise-Wrapper

const openDb = (name, version) => new Promise((resolve, reject) => {
  const req = indexedDB.open(name, version);

  req.onupgradeneeded = ({ oldVersion, target }) => {
    const db = target.result;
    if (oldVersion < 1) db.createObjectStore('logs', { autoIncrement: true });
    if (oldVersion < 2) db.deleteObjectStore('logs'); // ab v2 nicht mehr benötigt
  };
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

const db = await openDb('app', 2);
console.log(db.objectStoreNames.contains('logs'));
false

// Wichtig · Fallstricke

  • InvalidStateError: wird geworfen, wenn die Methode außerhalb einer versionchange-Transaktion (z. B. in onsuccess) aufgerufen wird.
  • NotFoundError: wird geworfen, wenn kein Speicher mit diesem Namen existiert. Vorher mit db.objectStoreNames.contains(name) prüfen.
  • TransactionInactiveError: tritt auf, wenn die Upgrade-Transaktion bereits beendet ist, etwa weil der Aufruf nach einem await oder in einem setTimeout erfolgt.
  • Die Daten sind unwiderruflich verloren. Wenn sie noch gebraucht werden, zuerst über event.target.transaction.objectStore(name) auslesen und in einen neuen Speicher kopieren.
  • Andere offene Verbindungen (z. B. in anderen Tabs) blockieren das Upgrade; dort sollte auf versionchange mit db.close() reagiert werden, sonst feuert blocked.
  • Wird von allen modernen Browsern unterstützt, auch in Web Workern.