Signatur
Beschreibung
getAllRecords() verbindet, was bisher auf zwei Methoden verteilt war: getAll() gibt nur die Werte zurück, getAllKeys() nur die Schlüssel. Die neue Methode liefert ein Array von IDBRecord-Objekten. Jedes davon hat die Eigenschaften key, primaryKey und value. Bei einem Object Store sind key und primaryKey gleich. Unterschiedlich werden sie nur bei IDBIndex.getAllRecords().
Die Methode ist vor allem bei Object Stores mit externen Schlüsseln nützlich, also Stores ohne keyPath, bei denen der Schlüssel nicht im Wert steht. Bisher brauchte man dafür entweder einen Cursor, der Eintrag für Eintrag vorgeht (langsam), oder zwei getrennte Anfragen, deren Ergebnisse man danach zusammenführen musste. Mit getAllRecords() reicht eine einzige Anfrage.
Über das Optionsobjekt lässt sich die Ergebnismenge mit einem Schlüsselbereich (query) eingrenzen, in der Menge begrenzen (count) und in der Richtung umkehren (direction). Mit direction: "prev" und count holt man zum Beispiel ohne Cursor die letzten N Einträge. Das ist praktisch für seitenweises Laden („die neuesten 20 Nachrichten“).
Die Methode ist asynchron und gibt sofort ein IDBRequest zurück. Das Ergebnis steht nach dem success-Ereignis in request.result.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options | object | {} | Optionales Objekt, das die Abfrage steuert. Es kann die folgenden Felder enthalten. |
| $options.query | IDBKeyRange | any | null | null | Ein Schlüssel oder ein IDBKeyRange, der die Datensätze eingrenzt. Bei null werden alle Datensätze berücksichtigt. |
| $options.count | number | alle Datensätze | Wie viele Datensätze höchstens zurückgegeben werden. Die Zahl muss zwischen 0 und 232−1 liegen. Bei 0 oder ohne Angabe gibt es keine Begrenzung. |
| $options.direction | "next" | "nextunique" | "prev" | "prevunique" | "next" | In welcher Richtung die Datensätze durchlaufen werden. "prev" liefert sie absteigend nach Schlüssel. Bei einem Object Store verhalten sich die unique-Varianten genauso wie die normalen, weil Primärschlüssel ohnehin eindeutig sind. |
Rückgabewert
IDBRequest. Nach dem success-Ereignis enthält result ein Array von IDBRecord-Objekten mit key, primaryKey und value. Wenn nichts passt, ist das Array leer.Beispiele
Alle Datensätze mit Schlüssel und Wert abrufen
const openDb = () => new Promise((resolve, reject) => {
const req = indexedDB.open('notizen-db', 1);
req.onupgradeneeded = () => {
// Store ohne keyPath: Der Schlüssel steht nicht im Wert
const store = req.result.createObjectStore('notizen');
store.put({ text: 'Einkaufen' }, 'n1');
store.put({ text: 'Sport' }, 'n2');
};
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const db = await openDb();
const store = db.transaction('notizen', 'readonly').objectStore('notizen');
const request = store.getAllRecords();
request.onsuccess = () => {
for (const { key, value } of request.result) {
console.log(key, value.text);
}
};
Die neuesten 20 Einträge laden (absteigend, begrenzt)
const getLatest = (db, limit = 20) => new Promise((resolve, reject) => {
const store = db.transaction('nachrichten', 'readonly').objectStore('nachrichten');
const req = store.getAllRecords({ direction: 'prev', count: limit });
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const neueste = await getLatest(db);
console.log(neueste.map((r) => r.primaryKey));
Schlüsselbereich abfragen, mit Rückfall für ältere Browser
const getRecordsInRange = (store, range) => new Promise((resolve, reject) => {
if ('getAllRecords' in IDBObjectStore.prototype) {
const req = store.getAllRecords({ query: range });
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
return;
}
// Rückfall: Datensätze per Cursor einsammeln
const records = [];
const req = store.openCursor(range);
req.onsuccess = () => {
const cursor = req.result;
if (!cursor) return resolve(records);
records.push({ key: cursor.key, primaryKey: cursor.primaryKey, value: cursor.value });
cursor.continue();
};
req.onerror = () => reject(req.error);
});
const store = db.transaction('bestellungen').objectStore('bestellungen');
const maerz = await getRecordsInRange(store, IDBKeyRange.bound('2024-03-01', '2024-03-31'));
console.log(maerz.length);
// Wichtig · Fallstricke
- Browser-Unterstützung: Die Methode gehört zu IndexedDB 3.0 und ist bisher nur in Chromium-Browsern verfügbar (Chrome/Edge 141+). Prüfe vor der Nutzung mit
'getAllRecords' in IDBObjectStore.prototype, ob sie vorhanden ist, und sieh einen Rückfall überopenCursor()odergetAll()plusgetAllKeys()vor. - Speicher: Ohne
countlanden alle Datensätze auf einmal im Arbeitsspeicher. Bei großen Stores solltest du seitenweise laden:countsetzen undquerymitIDBKeyRange.lowerBound(letzterKey, true)weiterschieben. - Ausnahmen:
TransactionInactiveError, wenn die Transaktion schon beendet ist, zum Beispiel nach einemawaitauf etwas anderes als eine IndexedDB-Anfrage.InvalidStateError, wenn der Store gelöscht wurde.DataErrorbei einem ungültigen Schlüssel oder Bereich.TypeErrorbei einem ungültigendirection-Wert. - Im selben Zug erlaubt die Spezifikation auch für
getAll()undgetAllKeys()ein Optionsobjekt mitdirection. Ältere Browser kennen dort nur die Positionsargumente(query, count).