Start · Sprachen · JavaScript · Referenz · IDBIndex.objectStore

IDBIndex.objectStore

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>IDBObjectStore</code> zurückgibt, zu dem der Index gehört.

seit JavaScript Baseline: alle Browser (IndexedDB 2.0) Kategorie: webapi

Signatur

IDBIndex.objectStore

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

Typ
IDBObjectStore
Beschreibung
Der Objektspeicher, auf den sich der Index bezieht.

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'));
};
kunden id true

Ü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);
};
Aktualisiert: true

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`);
};
Testkunden aus "kunden" 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 await auf ein Promise, das nichts mit IndexedDB zu tun hat, lösen Aufrufe wie get() oder put() eine TransactionInactiveError-DOMException aus.
  • Schreibzugriff: put(), add() und delete() auf index.objectStore gehen nur in einer Transaktion mit dem Modus 'readwrite'. Sonst entsteht eine ReadOnlyError-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-indexeddb nötig.