Signatur
Beschreibung
Mit deleteIndex() löschen Sie einen Index, den Sie vorher mit createIndex() auf einem IDBObjectStore angelegt haben. Die gespeicherten Datensätze bleiben dabei erhalten. Entfernt werden nur der Index und seine internen Verweise.
Das Schema einer IndexedDB-Datenbank lässt sich nur in einer Transaktion vom Typ versionchange ändern. Deshalb ist deleteIndex() nur im Handler des upgradeneeded-Events eines IDBOpenDBRequest sinnvoll. Außerhalb davon wirft der Aufruf eine InvalidStateError-DOMException.
Typische Einsatzfälle sind Schema-Migrationen: Ein Index wird nicht mehr gebraucht, soll umbenannt werden oder bekommt einen anderen keyPath oder andere Optionen wie unique oder multiEntry. Einen bestehenden Index können Sie nicht nachträglich ändern. Sie müssen ihn löschen und mit createIndex() neu anlegen.
Die Methode arbeitet synchron und gibt kein Request-Objekt zurück. Ob die Änderung endgültig übernommen wurde, erfahren Sie erst, wenn die Upgrade-Transaktion erfolgreich abgeschlossen ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Name des vorhandenen Index, der gelöscht werden soll. Groß- und Kleinschreibung wird unterschieden. |
Rückgabewert
undefined zurück. Die Löschung wird übernommen, sobald die versionchange-Transaktion erfolgreich abgeschlossen ist.Beispiele
Veralteten Index bei einem Versionsupgrade löschen
const request = indexedDB.open('shop', 2);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const tx = event.target.transaction;
const store = tx.objectStore('kunden');
// Index 'telefon' wird ab Version 2 nicht mehr gebraucht
if (store.indexNames.contains('telefon')) {
store.deleteIndex('telefon');
console.log('Index "telefon" entfernt');
}
};
request.onsuccess = () => console.log('Datenbank bereit');
Index ändern: löschen und mit neuen Optionen neu anlegen
const request = indexedDB.open('shop', 3);
request.onupgradeneeded = (event) => {
const store = event.target.transaction.objectStore('kunden');
// Bestehende Indizes lassen sich nicht ändern, also löschen und neu anlegen
if (store.indexNames.contains('email')) {
store.deleteIndex('email');
}
store.createIndex('email', 'kontakt.email', { unique: true });
console.log([...store.indexNames]);
};
Versionsabhängige Migration mit oldVersion
const openDb = () => new Promise((resolve, reject) => {
const request = indexedDB.open('notizen', 4);
request.onupgradeneeded = (event) => {
const db = request.result;
const store = event.oldVersion < 1
? db.createObjectStore('eintraege', { keyPath: 'id', autoIncrement: true })
: request.transaction.objectStore('eintraege');
if (event.oldVersion < 1) store.createIndex('titel', 'titel');
if (event.oldVersion >= 1 && event.oldVersion < 4) {
// Ab Version 4 wird nach 'erstellt' statt nach 'titel' gesucht
if (store.indexNames.contains('titel')) store.deleteIndex('titel');
}
if (event.oldVersion < 4) store.createIndex('erstellt', 'erstellt');
};
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
const db = await openDb();
console.log(db.version);
// Wichtig · Fallstricke
- Nur im Upgrade erlaubt: Wenn Sie die Methode außerhalb einer
versionchange-Transaktion aufrufen, wirft sie eineInvalidStateError-Exception. Das Gleiche passiert, wenn der Objektspeicher inzwischen gelöscht wurde. - Unbekannter Name: Gibt es keinen Index mit diesem Namen, wirft die Methode eine
NotFoundError-Exception. Prüfen Sie deshalb vorher mitstore.indexNames.contains(name), ob der Index existiert. - TransactionInactiveError: Diese Exception tritt auf, wenn die Upgrade-Transaktion schon beendet ist, zum Beispiel wenn Sie die Methode erst nach einem
awaitauf ein Promise außerhalb von IndexedDB aufrufen. - Wird die Upgrade-Transaktion abgebrochen (
abort()oder ein Fehler), wird auch die Löschung rückgängig gemacht. - Die Datensätze selbst gehen nicht verloren. Wenn Sie den Index neu anlegen, baut der Browser ihn aus allen vorhandenen Datensätzen neu auf. Bei großen Datenmengen kann das spürbar dauern.
- Die Methode wird von allen modernen Browsern unterstützt, auch in Web Workern. In manchen Browsern ist IndexedDB im privaten Modus eingeschränkt, etwa in älteren Firefox-Versionen.