Signatur
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]);
};
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'));
// Wichtig · Fallstricke
InvalidStateError: wird geworfen, wenn die Methode außerhalb einerversionchange-Transaktion (z. B. inonsuccess) aufgerufen wird.NotFoundError: wird geworfen, wenn kein Speicher mit diesem Namen existiert. Vorher mitdb.objectStoreNames.contains(name)prüfen.TransactionInactiveError: tritt auf, wenn die Upgrade-Transaktion bereits beendet ist, etwa weil der Aufruf nach einemawaitoder in einemsetTimeouterfolgt.- 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
versionchangemitdb.close()reagiert werden, sonst feuertblocked. - Wird von allen modernen Browsern unterstützt, auch in Web Workern.