Start · Sprachen · JavaScript · Referenz · IDBObjectStore.deleteIndex()

IDBObjectStore.deleteIndex()

Methode

Entfernt den Index mit dem angegebenen Namen dauerhaft aus einem Objektspeicher. Das ist nur während eines Versionsupgrades (<code>versionchange</code>-Transaktion) erlaubt.

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

Signatur

IDBObjectStore.prototype.deleteIndex(name)

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

Typ
void
Beschreibung
Gibt 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 "telefon" entfernt 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]);
};
["email"]

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);
4

// Wichtig · Fallstricke

  • Nur im Upgrade erlaubt: Wenn Sie die Methode außerhalb einer versionchange-Transaktion aufrufen, wirft sie eine InvalidStateError-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 mit store.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 await auf 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.