Signatur
Beschreibung
Die schreibgeschützte Eigenschaft objectStore eines IDBIndex verweist auf den Objektspeicher (IDBObjectStore), in dem der Index angelegt wurde. Ein Index ist immer genau einem Objektspeicher zugeordnet. Diese Zuordnung ändert sich nicht, solange der Index existiert.
Nützlich ist die Eigenschaft vor allem dann, wenn Code nur ein Index-Objekt übergeben bekommt, etwa in einer Hilfsfunktion, und trotzdem auf den zugehörigen Speicher zugreifen muss. Typische Fälle sind: einen Datensatz über den Index finden und ihn danach im Speicher mit put() ändern oder mit delete() löschen, den Namen des Speichers protokollieren oder dessen keyPath auslesen.
Das zurückgegebene Objekt ist dieselbe IDBObjectStore-Instanz, die auch transaction.objectStore(name) innerhalb derselben Transaktion liefert. Es gilt deshalb nur so lange, wie die Transaktion aktiv ist, aus der der Index stammt.
Rückgabewert
Beispiele
Zugehörigen Objektspeicher eines Index auslesen
const request = indexedDB.open('shop', 1);
request.onupgradeneeded = () => {
const db = request.result;
const store = db.createObjectStore('kunden', { keyPath: 'id' });
store.createIndex('nachEmail', 'email', { unique: true });
};
request.onsuccess = () => {
const db = request.result;
const tx = db.transaction('kunden', 'readonly');
const index = tx.objectStore('kunden').index('nachEmail');
console.log(index.objectStore.name);
console.log(index.objectStore.keyPath);
console.log(index.objectStore === tx.objectStore('kunden'));
};
Über den Index suchen und im Speicher aktualisieren
// Die Hilfsfunktion bekommt nur den Index übergeben
const markiereAlsVip = (index, email) =>
new Promise((resolve, reject) => {
const req = index.get(email);
req.onsuccess = () => {
const kunde = req.result;
if (!kunde) return resolve(false);
kunde.vip = true;
// Schreiben über den zugehörigen Objektspeicher
const putReq = index.objectStore.put(kunde);
putReq.onsuccess = () => resolve(true);
putReq.onerror = () => reject(putReq.error);
};
req.onerror = () => reject(req.error);
});
const open = indexedDB.open('shop', 1);
open.onsuccess = async () => {
const db = open.result;
const tx = db.transaction('kunden', 'readwrite');
const index = tx.objectStore('kunden').index('nachEmail');
const ok = await markiereAlsVip(index, 'anna@example.com');
console.log('Aktualisiert:', ok);
};
Datensätze über Index-Cursor löschen
const open = indexedDB.open('shop', 1);
open.onsuccess = () => {
const db = open.result;
const tx = db.transaction('kunden', 'readwrite');
const index = tx.objectStore('kunden').index('nachEmail');
const store = index.objectStore;
index.openCursor(IDBKeyRange.bound('test', 'test\uffff')).onsuccess = (e) => {
const cursor = e.target.result;
if (!cursor) return;
// primaryKey des Cursors identifiziert den Datensatz im Speicher
store.delete(cursor.primaryKey);
cursor.continue();
};
tx.oncomplete = () => console.log(`Testkunden aus "${store.name}" gelöscht`);
};
// Wichtig · Fallstricke
- Nur lesbar: Wer der Eigenschaft einen Wert zuweist, ändert nichts. Im Strict Mode wirft die Zuweisung einen
TypeError. - Transaktion beachten: Der zurückgegebene Speicher gehört zur Transaktion des Index. Ist diese abgeschlossen, zum Beispiel nach einem
awaitauf ein Promise, das nichts mit IndexedDB zu tun hat, lösen Aufrufe wieget()oderput()eineTransactionInactiveError-DOMExceptionaus. - Schreibzugriff:
put(),add()unddelete()aufindex.objectStoregehen nur in einer Transaktion mit dem Modus'readwrite'. Sonst entsteht eineReadOnlyError-Ausnahme. - Kompatibilität: In allen modernen Browsern und in Web Workern verfügbar. In Node.js gibt es IndexedDB nicht nativ, dafür sind Polyfills wie
fake-indexeddbnötig.