Start · Sprachen · JavaScript · Referenz · IDBObjectStore.indexNames

IDBObjectStore.indexNames

Eigenschaft

Nur lesbare Eigenschaft, die eine <code>DOMStringList</code> mit den Namen aller Indizes des Object Stores liefert.

seit JavaScript Baseline: alle Browser Kategorie: webapi

Signatur

IDBObjectStore.indexNames

Beschreibung

Die Eigenschaft indexNames eines IDBObjectStore gibt eine DOMStringList zurück. Diese enthält die Namen aller Indizes, die für diesen Object Store angelegt wurden. Die Namen sind aufsteigend sortiert.

Typische Einsatzfälle sind Datenbank-Migrationen im upgradeneeded-Handler und Diagnose-Zwecke. Bei einer Migration prüft man mit indexNames.contains(name), ob ein Index schon existiert, bevor man createIndex() oder deleteIndex() aufruft. So verhindert man einen ConstraintError bzw. NotFoundError.

Die Eigenschaft steht in jeder Transaktion zur Verfügung, also in readonly, readwrite und versionchange. Ändern lässt sich die Menge der Indizes aber nur während einer versionchange-Transaktion.

Rückgabewert

Typ
DOMStringList
Beschreibung
Eine sortierte Liste der Indexnamen. Sie bietet length, item(index) und contains(name) und ist iterierbar, zum Beispiel mit Array.from() oder Spread.

Beispiele

Indizes eines Stores auflisten

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

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  const store = db.createObjectStore('produkte', { keyPath: 'id' });
  store.createIndex('preis', 'preis');
  store.createIndex('kategorie', 'kategorie');
};

request.onsuccess = (event) => {
  const db = event.target.result;
  const tx = db.transaction('produkte', 'readonly');
  const store = tx.objectStore('produkte');
  // DOMStringList in ein echtes Array umwandeln
  console.log(Array.from(store.indexNames));
  console.log(store.indexNames.length);
};
["kategorie", "preis"] 2

Sichere Migration mit contains()

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

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  // Vorhandenen Store über die versionchange-Transaktion holen
  const store = event.target.transaction.objectStore('produkte');

  if (!store.indexNames.contains('name')) {
    store.createIndex('name', 'name', { unique: false });
  }
  // Veralteten Index nur löschen, wenn er existiert
  if (store.indexNames.contains('preis')) {
    store.deleteIndex('preis');
  }
  console.log([...store.indexNames]);
};
["kategorie", "name"]

Alle Indizes mit Details ausgeben

const beschreibeIndizes = (db, storeName) => {
  const store = db.transaction(storeName).objectStore(storeName);
  for (const name of store.indexNames) {
    const idx = store.index(name);
    console.log(`${name}: keyPath=${idx.keyPath}, unique=${idx.unique}`);
  }
};
kategorie: keyPath=kategorie, unique=false name: keyPath=name, unique=false

// Wichtig · Fallstricke

  • Der Rückgabewert ist eine DOMStringList und kein Array. Methoden wie includes(), map() oder filter() gibt es darauf nicht. Nutze contains() oder wandle die Liste vorher mit Array.from() um.
  • Die Liste ist eine Momentaufnahme. Sie wird beim Zugriff erzeugt und aktualisiert sich nicht nachträglich. Nach createIndex() oder deleteIndex() musst du indexNames daher erneut abfragen.
  • Ist die Transaktion schon beendet, wirft der Zugriff auf den Store bzw. seine Indizes unter Umständen einen InvalidStateError. indexNames selbst ist in der Regel trotzdem noch lesbar.
  • Indizes lassen sich nur im upgradeneeded-Handler anlegen oder entfernen. Dort wird der vorhandene Store über event.target.transaction.objectStore() geholt.
  • Die Eigenschaft wird von allen modernen Browsern unterstützt und ist auch in Web Workern verfügbar. In privaten Fenstern kann IndexedDB eingeschränkt sein.