Signatur
Beschreibung
Die Methode getAllRecords() des IDBIndex-Interfaces liefert in einer einzigen Anfrage alle Datensätze eines Index. Jeder Eintrag im Ergebnis ist ein IDBRecord-Objekt mit drei Eigenschaften: key (der Indexschlüssel), primaryKey (der Primärschlüssel im zugehörigen Object Store) und value (der gespeicherte Wert).
Bisher musste man für diese Kombination entweder zwei getrennte Aufrufe von getAll() und getAllKeys() machen und die Ergebnisse zusammenführen, oder einen IDBCursor Eintrag für Eintrag durchlaufen. getAllRecords() vereint beides. Die Methode ist besonders nützlich, wenn man Daten seitenweise laden will: Über den Parameter direction lässt sich außerdem rückwärts lesen oder nur eindeutige Indexwerte abfragen. Mit getAll() ging das bisher nicht.
Wie alle IndexedDB-Operationen arbeitet die Methode asynchron und gibt ein IDBRequest zurück. Das Ergebnis steht im success-Ereignis unter request.result bereit. Der Aufruf muss innerhalb einer aktiven Transaktion (readonly oder readwrite) erfolgen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options | object | {} | Optionales Objekt, das festlegt, welche Datensätze abgefragt werden. |
| $options.query | IDBKeyRange | any | null | Ein Indexschlüssel oder ein IDBKeyRange, auf den die Ergebnisse eingeschränkt werden. Bei null oder ohne Angabe werden alle Datensätze geliefert. |
| $options.count | number | unbegrenzt | Höchstzahl der gelieferten Datensätze, als ganze Zahl von 0 bis 232−1. 0 oder keine Angabe heißt: keine Begrenzung. |
| $options.direction | "next" | "nextunique" | "prev" | "prevunique" | "next" | Leserichtung, wie bei openCursor(). Mit prev wird absteigend gelesen. Mit den *unique-Varianten wird pro Indexschlüssel nur ein Datensatz geliefert. |
Rückgabewert
IDBRequest. Im Erfolgsfall enthält result ein Array von IDBRecord-Objekten mit den Eigenschaften key, primaryKey und value. Die Reihenfolge ergibt sich aus direction.Beispiele
Alle Datensätze eines Index lesen
// Vorausgesetzt: Store "kunden" (keyPath "id") mit Index "nachStadt" (keyPath "stadt")
const tx = db.transaction('kunden', 'readonly');
const index = tx.objectStore('kunden').index('nachStadt');
const request = index.getAllRecords();
request.onsuccess = () => {
for (const { key, primaryKey, value } of request.result) {
console.log(`${key} → #${primaryKey}: ${value.name}`);
}
};
request.onerror = () => console.error(request.error);
Neueste Einträge absteigend und begrenzt, mit Promise-Hülle
const requestToPromise = (req) => new Promise((resolve, reject) => {
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
const neuesteBestellungen = async (db, anzahl = 5) => {
const index = db.transaction('bestellungen')
.objectStore('bestellungen')
.index('nachDatum');
const records = await requestToPromise(index.getAllRecords({
direction: 'prev',
count: anzahl
}));
return records.map(r => ({ id: r.primaryKey, datum: r.key, ...r.value }));
};
console.log(await neuesteBestellungen(db, 3));
Seitenweise laden mit Rückfallebene für ältere Browser
const ladeSeite = (index, abSchluessel, groesse) => {
const query = abSchluessel == null
? null
: IDBKeyRange.lowerBound(abSchluessel, true); // exklusiv
if ('getAllRecords' in IDBIndex.prototype) {
return new Promise((resolve, reject) => {
const req = index.getAllRecords({ query, count: groesse });
req.onsuccess = () => resolve(req.result);
req.onerror = () => reject(req.error);
});
}
// Rückfallebene: Cursor durchlaufen
return new Promise((resolve, reject) => {
const result = [];
const req = index.openCursor(query);
req.onsuccess = () => {
const cursor = req.result;
if (!cursor || result.length >= groesse) return resolve(result);
result.push({ key: cursor.key, primaryKey: cursor.primaryKey, value: cursor.value });
cursor.continue();
};
req.onerror = () => reject(req.error);
});
};
// Wichtig · Fallstricke
- Kompatibilität: Die Methode gehört zum Entwurf IndexedDB 3.0 und steht bisher nur in Chromium-Browsern bereit (Chrome/Edge ab etwa Version 141). Firefox und Safari unterstützen sie derzeit nicht. Prüfen Sie die Verfügbarkeit daher immer mit
'getAllRecords' in IDBIndex.prototypeund sehen Sie einen Cursor als Rückfallebene vor. - Nicht mehrdeutige Schlüssel: Bei Indizes mit
multiEntry: trueoder mit Duplikaten kann derselbe Primärschlüssel mehrmals im Ergebnis auftauchen, nämlich einmal pro Indexeintrag. Filtern Sie Duplikate bei Bedarf überprimaryKeyheraus. - Speicherbedarf: Ohne
countwird der gesamte Index auf einmal in den Arbeitsspeicher geladen. Bei großen Datenmengen sollten Sie seitenweise laden (countzusammen mitIDBKeyRange.lowerBound(letzterKey, true)). - Fehler: Die Methode wirft
TransactionInactiveError, wenn die Transaktion schon beendet ist,InvalidStateError, wenn Index oder Store gelöscht wurden, undDataErrorbei einem ungültigen Schlüssel oder Bereich inquery. EinTypeErrortritt auf, wenncountaußerhalb des erlaubten Bereichs liegt. - Beim Seitenweise-Laden mit Duplikaten im Index reicht der Indexschlüssel allein als Fortsetzungspunkt nicht aus. Hier ist ein Cursor mit
continuePrimaryKey()zuverlässiger.