2011-10-17 1 views
13

Sto creando uno strumento per uso personale che necessita di un semplice database. Questa sembra una buona occasione per imparare l'API IndexedDB HTML5, ma è importante che io non perda dati in nessun punto.Esportazione e importazione dei dati IndexedDB

Suppongo che il backup della directory del profilo del browser possa essere eseguito per un backup, ma mi piacerebbe anche lavorare potenzialmente con diversi computer, quindi esportare e importare il database sarebbe bello. Esiste un modo semplice per esportare e importare i database IndexedDB? Le soluzioni specifiche del browser sono ok.

+1

Sono un po 'sorpreso non ci sono opzioni per qualcosa di simile negli ispettori web. L'ispettore di Chrome ti consente di visualizzare il database, ma non sembra che tu possa interagire molto con esso. – Bart

+0

C'è qualche fortuna Juhana? –

+0

@StevendeSalas Non ancora - Suppongo sia probabile che sia abbastanza nuovo che strumenti come questo non esistono ancora. – JJJ

risposta

0

uso Prova jStorage, supporta la maggior parte dei browser, ad eccezione di quelli senza localStorage (come deprecato Safari3)

E 'avuto un sacco di funzioni, ma possiamo provare ottenere quello che vuoi con quelli:

set (key, value)

$.jStorage.set(key, value) 

Salva un valore alla memoria locale. la chiave deve essere una stringa altrimenti viene generata un'eccezione. il valore può essere qualsiasi valore JSONeable, inclusi oggetti e matrici o un nodo XML. Attualmente i nodi XML non possono essere nidificati all'interno di altri oggetti: $ .jStorage.set ("xml", xml_node) è OK ma $ .jStorage.set ("xml", {xml: xml_node}) non lo è.


get (tasto [, default])

value = $.jStorage.get(key) 
value = $.jStorage.get(key, "default value") 

get recupera il valore se la chiave esiste, o di default se non lo fa. la chiave deve essere una stringa altrimenti viene generata un'eccezione. l'impostazione predefinita può essere qualsiasi valore.


flush()

$.jStorage.flush() 

Cancella cache.


index()

$.jStorage.index() 

Riporta tutte le chiavi attualmente in uso come una matrice.

var index = $.jStorage.index(); 
console.log(index); // ["key1","key2","key3"] 

Con questo in mente, considerando che si dispone già di un DB impostato, è possibile utilizzare var index = $.jStorage.index(); e con la matrice, creare un ciclo jQuery .each() che ottiene ogni tasto della matrice e la chiamata the get() $.jStorage.get(key) e aggiungi a una grande stringa, che alla fine può essere analizzata come .csv, o anche XML o json (a tua scelta).

Con questi dati nelle mani, è possibile $.jStorage.flush() cancellare.

Quindi, se si desidera importare i dati per un nuovo DB, tutto ciò che è necessario fare è un .each() che legge la stringa/file che è stato salvato e inizia a impostare il valore kay/valore con $.jStorage.set(key, value).

Se non si dispone già di un DB, compilare uno nuovo con $.jStorage.set(key, value). :)

+2

Questo non risponde alla domanda in sé ma offre una soluzione al problema sottostante, quindi +1. – JJJ

+0

Sarebbe divertente per la persona che ha aggiunto -1 oggi (2 anni dopo la risposta è stata pubblicata) per dire perché downvoted. – RaphaelDDL

+3

1 anno dopo lasciami rispondere alla tua domanda, probabilmente era per lo stesso motivo che ho considerato downvoting: non risponde alla domanda appena Juhana ha già menzionato –

1

È possibile farlo in WebSQL scrivendo un po 'di Javascript su una soluzione posted here, tuttavia si perde la possibilità di imparare IndexDB.

Se si vuole davvero imparare IndexDB al suo interno, è possibile scrivere da soli lo strumento di importazione/esportazione, a mio avviso ce ne sarà abbastanza bisogno per uno in futuro.

5

Non c'è nulla di simile disponibile nello pure IndexedDB spec, tuttavia è possibile scrivere i propri metodi per ottenere ciò.

I passi fondamentali per importare i dati devono

  1. aprire un database di IndexedDB
  2. creare un archivio di oggetti
  3. aggiungere indici
  4. ciclo attraverso gli oggetti e aggiungere uno per uno (tramite un add o put funzionamento)

Per esportare un negozio di oggetti è possibile :

  1. aprono un cursore con zero come limite sinistro e ad ogni tick
  2. aggiungi onsuccess callback per l'oggetto di richiesta per acquisire il valore di riga
  3. su ciascun callback successo spingere la riga a una privilegiata array var.

La riga finale emetterà null, che è uno stato che si può guardare per capire quando il cursore ha esaurito tutti i suoi record ed è fatto. Quando ciò accade, è possibile chiamare una callback di esportazione che passa la matrice privilegiata di oggetti che rappresentano un backup del proprio archivio oggetti.

+3

Per esperienza, posso dire che la risposta dell'editore è l'unico modo per farlo. Inoltre, tieni presente che devi essere molto intelligente con tutta la programmazione asincrona che richiede. Mi raccomando di avere un oggetto cache in cui tutti i dati vengono scaricati. –

+1

Ho scritto un modulo [indexeddb-export-import] (https://github.com/Polarisation/indexeddb-export-import) che esegue questa operazione, sostanzialmente come descritto in questa risposta. –