Signatur
Beschreibung
Die Eigenschaft name der Schnittstelle IDBIndex enthält den Namen, unter dem der Index in seinem Object Store angelegt wurde. Das ist der erste Parameter, den man an IDBObjectStore.createIndex() übergibt. Über denselben Namen holt man den Index später mit IDBObjectStore.index() wieder ab.
Lesend nutzt man name vor allem beim Debuggen, beim Protokollieren und bei generischem Code, der über alle Indizes eines Stores läuft (etwa über store.indexNames). Wenn man an einer Stelle nur das IDBIndex-Objekt hat, lässt sich so feststellen, um welchen Index es sich handelt.
Die Eigenschaft ist nicht nur lesbar. Man kann ihr einen neuen Wert zuweisen und benennt den Index damit um, ohne ihn zu löschen und neu aufzubauen. Die Indexdaten bleiben also erhalten, was bei großen Datenbeständen viel Rechenzeit spart. Das geht aber nur innerhalb einer versionchange-Transaktion, also im Handler für das Ereignis upgradeneeded von indexedDB.open().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $neuerName | string | Nur beim Schreiben (Setter): der neue Name des Index. Er muss im Object Store eindeutig sein und darf nur während einer versionchange-Transaktion zugewiesen werden. |
Rückgabewert
IDBObjectStore.indexNames steht.Beispiele
Namen eines Index auslesen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = (event) => {
const db = event.target.result;
const store = db.createObjectStore('kunden', { keyPath: 'id' });
store.createIndex('nach_email', 'email', { unique: true });
};
request.onsuccess = (event) => {
const db = event.target.result;
const tx = db.transaction('kunden', 'readonly');
const index = tx.objectStore('kunden').index('nach_email');
console.log(`Index: ${index.name}, Schlüsselpfad: ${index.keyPath}`);
};
Alle Indizes eines Stores protokollieren
const logIndexes = (db, storeName) => {
const store = db.transaction(storeName, 'readonly').objectStore(storeName);
for (const indexName of store.indexNames) {
const index = store.index(indexName);
console.log(`${index.name} (unique: ${index.unique}, multiEntry: ${index.multiEntry})`);
}
};
const req = indexedDB.open('shop', 1);
req.onsuccess = () => logIndexes(req.result, 'kunden');
Index beim Versions-Upgrade umbenennen
const request = indexedDB.open('shop', 2);
request.onupgradeneeded = (event) => {
const tx = event.target.transaction; // versionchange-Transaktion
const store = tx.objectStore('kunden');
if (event.oldVersion < 2 && store.indexNames.contains('nach_email')) {
const index = store.index('nach_email');
index.name = 'email_idx'; // Daten bleiben erhalten
console.log('Umbenannt in:', index.name);
}
};
Fehler beim Umbenennen außerhalb eines Upgrades
const req = indexedDB.open('shop', 2);
req.onsuccess = () => {
const db = req.result;
const index = db.transaction('kunden', 'readwrite')
.objectStore('kunden')
.index('email_idx');
try {
index.name = 'anderer_name';
} catch (err) {
console.log(err.name);
}
};
// Wichtig · Fallstricke
- Umbenennen nur während eines Upgrades: Setzt man
nameaußerhalb einerversionchange-Transaktion, wirft der Browser eineInvalidStateError-DOMException. Das gilt auch in einerreadwrite-Transaktion. Dieselbe Ausnahme kommt, wenn der Index oder sein Object Store gelöscht wurde. - Inaktive Transaktion: Ist die Upgrade-Transaktion nicht mehr aktiv (zum Beispiel nach einem
awaitauf ein Promise, das nichts mit IndexedDB zu tun hat), wirdTransactionInactiveErrorgeworfen. - Namenskonflikt: Gibt es im selben Object Store schon einen Index mit dem neuen Namen, wird
ConstraintErrorgeworfen. Weist man den gleichen Namen noch einmal zu, passiert nichts. - Nach dem Umbenennen findet man den Index nur noch unter dem neuen Namen. Aufrufe wie
store.index('alter_name')werfen dannNotFoundError. Deshalb sollte man alle Stellen im Code anpassen. - Kompatibilität: Lesen funktioniert in allen Browsern, die IndexedDB unterstützen. Das Umbenennen gibt es erst in neueren Versionen (Chrome/Edge 58+, Firefox 51+, Safari 10.1+). In sehr alten Browsern bleibt nur: Index mit
deleteIndex()löschen und mitcreateIndex()neu anlegen.