2013-03-09 1 views
7

Aggiunta di un oggetto a un oggetto IndexedDB L'archivio fallirà se la chiave esiste già. Come posso verificare l'esistenza di un oggetto con una determinata chiave, preferibilmente in modo sincrono (nessun motivo per un altro livello di callback) e senza tirare l'oggetto.Verificare se IndexedDB objectStore contiene già la chiave

So come ottenere le richieste in modo asincrono tramite le transazioni, ma sembra un po 'un calvario da passare ogni volta che voglio aggiungere un oggetto.

nota soluzione deve solo lavorare in Chrome (se che aiuta)

risposta

6

Finora nessuno dei browser ha implementato l'API di sincronizzazione, quindi è necessario eseguirlo async. Un objectStore espone un metodo get che viene fornito con una chiave e restituirà l'oggetto (o null) che corrisponde alla chiave.

C'è davvero un buon tutorial su MDN che copre con IDB, e getting a record è coperto troppo, ma il codice inline è:

db.transaction("customers").objectStore("customers").get("444-44-4444").onsuccess = function(event) { 
    alert("Name for SSN 444-44-4444 is " + event.target.result.name); 
}; 

Se non si desidera recuperare il record allora si può sempre usato il Metodo count su un indice come spiegato here in the spec. In base al risultato, è possibile utilizzare add o put per modificare il record, in questo modo si salverà l'estrazione del record se non è necessario.

+0

Idealmente non vorrei estrarre e inizializzare un record (alcuni degli oggetti hanno molti dati profondamente annidati). Alla ricerca di qualcosa di simile agli ESISTE di SQL.So che indexedDB non è basato su SQL, ma altri negozi di valore-chiave come il supporto di Redis controllano l'esistenza di una chiave – Chris

+0

@Chris - nah non esiste un metodo del genere, ho aggiunto un'altra alternativa per risolverlo se non lo fai t voglio idratare l'oggetto –

+0

Beh, questo risponde, anche se non nel modo in cui speravo haha. Grazie! – Chris

10

Il modo migliore per controllare l'esistenza di una chiave è objectStore.count (chiave). Che è asincrono

Nel tuo caso, l'opzione migliore è apertaCursore della tua chiave. Se esiste, il cursore verrà visualizzato.

+2

Sì, questa sembra essere la cosa più vicina a ciò che voglio. Ammirate le promesse! – Chris

1

La domanda è: perché vuoi sapere questo? Forse dovresti usare un altro approccio?

È possibile utilizzare l'incremento automatico, in questo modo non è necessario verificare se esiste una chiave, si otterrà sempre uno unico.

È inoltre possibile utilizzare il metodo put anziché il metodo add. Con il put i dati verranno aggiornati se la chiave esiste e se la chiave non esiste i dati vengono aggiunti.

Tutto dipende dal motivo per cui si desidera verificare se esiste qualcosa.

+0

Perché sto creando un'applicazione che, al momento dell'installazione, carica JSON come dati demo. Nei test, e in alcuni casi in natura, la richiamata dell'installazione si attiva più volte, quindi i dati dimostrativi sono già presenti (dato che indexedDB non viene cancellato). – Chris

+0

Quindi in tal caso è possibile utilizzare il metodo put. I dati esistenti verranno sovrascritti e verranno aggiunti nuovi dati –

+1

Va bene che funziona in questo caso molto specifico, ma non è lo stesso che verificare l'esistenza. Questo è solo forzare i dati nel DB. Ci sono altri casi in cui posso immaginare che qualcuno voglia verificare l'esistenza di un record senza estrarre i dati o forzare l'aggiornamento. – Chris

2

Un po 'in ritardo per una risposta, ma possibile aiuta gli altri. Ho ancora imbattuto -come i guess- sopra lo stesso problema, ma è molto semplice:

Se si desidera inserire o aggiornare i record si utilizza objectStore.put(object)(help)
Se si desidera solo per inserire i record che si utilizzano objectStore.add(object)(help)

Quindi se si utilizza add(object) e una chiave di registrazione esiste ancora nel DB, non verrà sovrascritta e verrà generato l'errore 0 "Errore di vincolo: la chiave esiste già nell'archivio oggetti".

Se si utilizza put(object), verrà sovrascritto.