Novato de IndexedDB aquí...
const queueStore = db.createObjectStore("queue", { keyPath: "id", autoIncrement: true }); queueStore.createIndex("HasBeenSent", ["sent"], { unique: false });Estoy en cola de datos, esperando una carga a un servidor en un momento posterior, por lo que por ahora el valor "enviado" es cero para cada registro; Actualizaré el registro para reflejar "enviado" igual a 1 más tarde.
Cuando trato de obtener todos los registros donde el valor de "enviado" es cero, obtengo un resultado vacío, usando
request = db.transaction('queue').objectStore('queue').index('HasBeenSent').getAll(0);Si elimino el cero y solo tengo corchetes vacíos, obtengo todas las filas en la tienda, pero si incluyo cualquier valor en los corchetes (0, 1, -1, etc.) cada vez obtengo resultados vacíos, incluso si definitivamente tener registros almacenados con esos valores.
(¿He estropeado algo en la configuración?)
¿Cómo consulto a la tienda para que devuelva todas las filas donde "enviado" es igual a cero?
Leí a través de varias fuentes que getAll() está bien en conjuntos de datos pequeños, pero puede ser lento y hambriento en conjuntos de datos grandes, así que decidí usar cursores que deberían funcionar mejor en conjuntos de datos grandes y pequeños. Pero me encontré con el mismo problema con resultados vacíos.
Lo que no funcionó:
const request = db.transaction('queue').objectStore('queue').index('sent').openCursor(0);ni
const request = db.transaction('queue').objectStore('queue').index('sent').openCursor(IDBKeyRange.only(0));¿Qué funcionó?
const keyrange = IDBKeyRange.only(0); const request = db.transaction('queue').objectStore('queue').index('sent').openCursor(keyrange);Me imagino (pero nunca probé) que al usar getAll(), necesitaría hacer algo similar definiendo primero el rango de teclas, luego incluyéndolo en la solicitud getAll(), como
const keyrange = IDBKeyRange.only(0); const request = db.transaction('queue').objectStore('queue').index('sent').getAll(keyrange);