Start · Sprachen · JavaScript · Referenz · IDBIndex.name

IDBIndex.name

Eigenschaft

Liefert den Namen eines IndexedDB-Index als String. Innerhalb einer <code>versionchange</code>-Transaktion kann man den Index darüber auch umbenennen.

seit JavaScript Baseline: alle Browser (Umbenennen seit Chrome 58, Kategorie: webapi

Signatur

IDBIndex.name

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

Typ
string
Beschreibung
Der aktuelle Name des Index, wie er in 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}`);
};
Index: nach_email, Schlüsselpfad: email

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');
nach_email (unique: true, multiEntry: false)

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);
  }
};
Umbenannt in: email_idx

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);
  }
};
InvalidStateError

// Wichtig · Fallstricke

  • Umbenennen nur während eines Upgrades: Setzt man name außerhalb einer versionchange-Transaktion, wirft der Browser eine InvalidStateError-DOMException. Das gilt auch in einer readwrite-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 await auf ein Promise, das nichts mit IndexedDB zu tun hat), wird TransactionInactiveError geworfen.
  • Namenskonflikt: Gibt es im selben Object Store schon einen Index mit dem neuen Namen, wird ConstraintError geworfen. 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 dann NotFoundError. 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 mit createIndex() neu anlegen.