Signatur
Beschreibung
Die Eigenschaft objectStoreNames einer IDBTransaction gibt eine DOMStringList zurück. Sie enthält die Namen aller IDBObjectStore-Objekte, die zum Geltungsbereich (engl. scope) der Transaktion gehören. Das sind genau die Speicher, die du beim Aufruf von IDBDatabase.transaction(storeNames, mode) angegeben hast.
Bei einer versionchange-Transaktion, also im upgradeneeded-Handler, sieht das anders aus: Hier umfasst die Transaktion automatisch alle Objektspeicher der Datenbank. Die Liste zeigt dann auch Speicher, die während des Upgrades mit createObjectStore() angelegt wurden. Mit deleteObjectStore() entfernte Speicher sind nicht mehr enthalten.
Nützlich ist die Eigenschaft vor allem in generischem Code, der eine Transaktion übergeben bekommt. Damit lässt sich vorab prüfen, ob ein bestimmter Speicher zugänglich ist, bevor man transaction.objectStore(name) aufruft. Ist der Speicher nicht im Geltungsbereich, wirft dieser Aufruf einen NotFoundError. Die Namen stehen in aufsteigend sortierter Reihenfolge in der Liste.
Rückgabewert
length und die Methoden item(index) und contains(name). Sie ist kein Array.Beispiele
Namen der Speicher einer Lese-Transaktion ausgeben
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = () => {
const db = request.result;
db.createObjectStore('produkte', { keyPath: 'id' });
db.createObjectStore('kunden', { keyPath: 'id' });
db.createObjectStore('bestellungen', { keyPath: 'id' });
};
request.onsuccess = () => {
const db = request.result;
const tx = db.transaction(['produkte', 'kunden'], 'readonly');
// DOMStringList in ein echtes Array umwandeln
const namen = Array.from(tx.objectStoreNames);
console.log(namen);
console.log(tx.objectStoreNames.length);
};
Im Upgrade-Handler nur fehlende Speicher anlegen
const request = indexedDB.open('notizen', 2);
request.onupgradeneeded = (event) => {
const db = request.result;
const tx = event.target.transaction; // versionchange-Transaktion
if (!tx.objectStoreNames.contains('eintraege')) {
db.createObjectStore('eintraege', { autoIncrement: true });
}
if (!tx.objectStoreNames.contains('tags')) {
db.createObjectStore('tags', { keyPath: 'name' });
}
// Neu angelegte Speicher erscheinen sofort in der Liste
console.log([...tx.objectStoreNames]);
};
Sicherer Zugriff auf einen Speicher in generischem Code
// Hilfsfunktion: liefert den Speicher oder null statt eines NotFoundError
const getStoreSafe = (tx, name) =>
tx.objectStoreNames.contains(name) ? tx.objectStore(name) : null;
const zaehleEintraege = (db, name) =>
new Promise((resolve, reject) => {
const tx = db.transaction(db.objectStoreNames, 'readonly');
const store = getStoreSafe(tx, name);
if (!store) {
resolve(0);
return;
}
const req = store.count();
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
// Aufruf (db aus indexedDB.open):
// const anzahl = await zaehleEintraege(db, 'produkte');
// Wichtig · Fallstricke
- Kein Array:
DOMStringListhat keine Methoden wieincludes(),map()oderfilter(). Verwendecontains()oder wandle die Liste mitArray.from()bzw. dem Spread-Operator um. - Geltungsbereich statt ganzer Datenbank: Bei
readonly- undreadwrite-Transaktionen stehen nur die angefragten Speicher in der Liste. Alle Speicher der Datenbank liefertIDBDatabase.objectStoreNames. - Wird ein Upgrade abgebrochen (
abort()), wird die Liste auf den Stand vor dem Upgrade zurückgesetzt. DOMStringListgibt es praktisch nur noch aus Kompatibilitätsgründen. In neuen APIs werden stattdessen Arrays verwendet.- Kompatibilität: Wird von allen aktuellen Browsern unterstützt, auch in Web Workern. Ältere Safari-Versionen hatten Lücken bei IndexedDB. Für sehr alte Browser lohnt sich deshalb eine Prüfung per Feature-Erkennung.