Start · Sprachen · JavaScript · Referenz · IDBObjectStore.getAllKeys()

IDBObjectStore.getAllKeys()

Methode

Liefert per <code>IDBRequest</code> die Primärschlüssel aller Datensätze eines Objektspeichers, optional gefiltert nach Schlüssel oder <code>IDBKeyRange</code> und begrenzt durch <code>count</code>.

seit JavaScript Baseline: alle modernen Browser (seit ca. 2018) Kategorie: webapi

Signatur

IDBObjectStore.prototype.getAllKeys(query, count)

Beschreibung

getAllKeys() liest nur die Primärschlüssel der Datensätze eines IDBObjectStore aus, nicht die Werte selbst. Das Ergebnis ist ein Array in aufsteigender Schlüsselreihenfolge und liegt im result des zurückgegebenen IDBRequest vor, sobald das Ereignis success ausgelöst wurde.

Die Methode eignet sich gut, wenn Sie herausfinden wollen, welche Einträge vorhanden sind, ohne große Objekte zu deserialisieren. Beispiele: Existenzprüfungen, Synchronisationsabgleiche mit einem Server oder das seitenweise Laden der Werte zu einem späteren Zeitpunkt. Im Vergleich zu einem Cursor per openKeyCursor() ist sie meist deutlich schneller, weil alle Schlüssel in einem einzigen Aufruf übertragen werden.

Mit dem Parameter query filtern Sie nach einem einzelnen Schlüssel oder einem Bereich (IDBKeyRange). count begrenzt die Anzahl der Treffer. Wird nichts übergeben, gibt die Methode alle Schlüssel des Speichers zurück.

Parameter

Name Typ Default Beschreibung
$query any | IDBKeyRange | null null (alle Datensätze) Ein gültiger Schlüssel oder ein IDBKeyRange, der die zurückzugebenden Schlüssel eingrenzt. undefined oder null wählt alle Datensätze aus.
$count number unbegrenzt Höchstanzahl der zurückgegebenen Schlüssel. Ganzzahl zwischen 0 und 232-1. 0 bedeutet: keine Begrenzung.

Beispiele

Alle Schlüssel eines Objektspeichers auslesen

const openReq = indexedDB.open('shop', 1);

openReq.onupgradeneeded = () => {
  const db = openReq.result;
  const store = db.createObjectStore('produkte', { keyPath: 'id' });
  store.put({ id: 3, name: 'Tasse' });
  store.put({ id: 1, name: 'Teller' });
  store.put({ id: 2, name: 'Gabel' });
};

openReq.onsuccess = () => {
  const db = openReq.result;
  const store = db.transaction('produkte', 'readonly').objectStore('produkte');
  const req = store.getAllKeys();

  req.onsuccess = () => console.log('Schlüssel:', req.result);
  req.onerror = () => console.error('Fehler:', req.error);
};
Schlüssel: [1, 2, 3]

Promise-Wrapper mit Bereich und Begrenzung

// Kleiner Helfer, um IDBRequest mit async/await zu nutzen
const promisify = (req) => new Promise((resolve, reject) => {
  req.onsuccess = () => resolve(req.result);
  req.onerror = () => reject(req.error);
});

const ersteBestellungenAb = async (db, abId, limit) => {
  const store = db.transaction('bestellungen').objectStore('bestellungen');
  const range = IDBKeyRange.lowerBound(abId); // abId einschließlich
  return promisify(store.getAllKeys(range, limit));
};

// Aufruf (db sei eine geöffnete IDBDatabase):
// const keys = await ersteBestellungenAb(db, 100, 5);
// console.log(keys);
[100, 101, 102, 103, 104]

Abgleich mit dem Server: fehlende IDs ermitteln

const fehlendeIds = async (db, serverIds) => {
  const store = db.transaction('artikel').objectStore('artikel');
  const lokaleKeys = await new Promise((resolve, reject) => {
    const req = store.getAllKeys();
    req.onsuccess = () => resolve(new Set(req.result));
    req.onerror = () => reject(req.error);
  });
  // Nur IDs zurückgeben, die lokal noch nicht gespeichert sind
  return serverIds.filter((id) => !lokaleKeys.has(id));
};

// const neu = await fehlendeIds(db, [1, 2, 5, 8]);
// console.log(neu);
[5, 8]

// Wichtig · Fallstricke

  • Nur Primärschlüssel: Es werden immer die Primärschlüssel des Speichers geliefert. Wollen Sie nach einem Index filtern, nutzen Sie IDBIndex.getAllKeys(). Dort ist query ein Indexschlüssel, das Ergebnis besteht aber ebenfalls aus Primärschlüsseln.
  • Speicherbedarf: Bei sehr großen Speichern landen alle Schlüssel gleichzeitig im Arbeitsspeicher. Arbeiten Sie dann mit count und einem IDBKeyRange ab dem letzten Schlüssel seitenweise oder verwenden Sie openKeyCursor().
  • Ausnahmen: TransactionInactiveError, wenn die Transaktion schon beendet ist, zum Beispiel nach einem await auf etwas anderes als IndexedDB. InvalidStateError, wenn der Objektspeicher gelöscht wurde. DataError bei einem ungültigen Schlüssel oder Bereich. Ein negatives count löst einen TypeError aus.
  • Kompatibilität: Wird von allen aktuellen Browsern unterstützt (Chrome 48+, Firefox 44+, Safari 10.1+, Edge 79+). Der alte Internet Explorer kennt die Methode nicht. Das Ergebnis ist immer aufsteigend sortiert. Eine Richtungsoption gibt es erst in neueren Entwürfen der Spezifikation.