Signatur
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
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);
};
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]);
};
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}`);
}
};
// Wichtig · Fallstricke
- Der Rückgabewert ist eine
DOMStringListund kein Array. Methoden wieincludes(),map()oderfilter()gibt es darauf nicht. Nutzecontains()oder wandle die Liste vorher mitArray.from()um. - Die Liste ist eine Momentaufnahme. Sie wird beim Zugriff erzeugt und aktualisiert sich nicht nachträglich. Nach
createIndex()oderdeleteIndex()musst duindexNamesdaher erneut abfragen. - Ist die Transaktion schon beendet, wirft der Zugriff auf den Store bzw. seine Indizes unter Umständen einen
InvalidStateError.indexNamesselbst ist in der Regel trotzdem noch lesbar. - Indizes lassen sich nur im
upgradeneeded-Handler anlegen oder entfernen. Dort wird der vorhandene Store überevent.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.