2012-02-29 15 views
6

Abbiamo un'app per Android e un'app per iPhone (stessa funzionalità) che utilizzano sqlite per l'archiviazione locale dei dati. Inizialmente le app non hanno dati, quindi alla prima esecuzione ricevono i dati da un server remoto e li archiviano in un database SQLite. Il database sqlite viene creato dal server e le app lo scaricano come un unico file, che viene quindi utilizzato per acquistare le app. Il file di database non è molto grande per gli standard odierni, ma neanche uno piccolo - circa 5-6 MB.Sincronizza/aggiorna i database sqlite

Ora, una volta ogni tanto, le app devono aggiornare i dati dal server. Ci sono alcuni approcci a cui posso pensare:

  1. Scaricare un nuovo database completo dal server e sostituire quello esistente. Questo suona come il modo più semplice per affrontare il problema se non fosse per un download ripetuto 5-6 MB. Le app richiedono all'utente se vogliono scaricare gli aggiornamenti, quindi questo potrebbe non essere un problema.

  2. Scaricare un database delta dal server, contenente solo i record nuovi/modificati e in qualche modo informazioni su quali record eliminare. Ciò porterebbe a una dimensione di download molto più piccola, ma il lavoro sul lato client è più complicato. Avrei bisogno di leggere un database e, in base a ciò che viene letto, aggiornarne un altro. Per quanto ne so, non c'è modo con sqlite di fare qualcosa come insert into db1.table1 (select * from db2.table1) dove db1 e db2 sono due database sqlite contenenti table1 della stessa struttura. (Il database sqlite completo contiene circa 10 tabelle con la più grande probabilmente contenente circa 500 record.)

  3. Scaricare il delta dei dati in un altro formato (json, xml, ecc.) E utilizzare queste informazioni per aggiornare il database nell'app. Lo stesso di prima: non tanto per il lato server, dimensioni di download inferiori rispetto al database completo, ma piuttosto un processo doloroso per fare gli aggiornamenti.

Quale dei tre approcci è consigliabile? O forse c'è ancora un altro modo in cui mi sono perso?

Molte grazie in anticipo.

+0

https://stackoverflow.com/questions/4008015/android-sqlite-bidirectional-synchronization-sqlite –

risposta

1

Dopo molte considerazioni e tentativi-ed-errori, sono andato per una combinazione di opzioni (2) e (3).

  1. Se nessun dato è presente, l'app scarica un file di database completo dal server.

  2. Se i dati sono presenti e è necessario un aggiornamento, l'app scarica del database dal server. E controlla il contenuto di un particolare valore in una determinata tabella. Tale valore si precisa se la nuova banca dati è quello di sostituire l'originale o se contiene delezioni/aggiornamenti/inserti

Questo risulta essere il modo più veloce (performance-saggio) e lascia tutto il lavoro pesante (determinazione se mettere tutto in un unico database o solo un aggiornamento) al server. Inoltre, con questo approccio, se devo modificare l'algoritmo per, diciamo, sempre scaricare il database completo, sarebbe solo una modifica sul server senza la necessità di ricompilare e ridistribuire l'app.

+0

potresti pubblicare qualche esempio o tutorial? –

+0

Vorrei anche vedere alcuni esempi: sto provando a sincronizzare i database SQLite, un database centrale memorizzato su Google Drive e qualsiasi numero di database offline memorizzati su singoli dispositivi Android (che potrebbero non avere sempre accesso a Internet). – Rohaq

+0

@Rohaq se il dispositivo non ha accesso a Internet, non è possibile sincronizzare nulla. Nel mio caso, la sincronizzazione è sempre a senso unico - dal server ai dispositivi - e la struttura del database non cambia, solo i dati. –

-1

Raccomanderò l'approccio 3, perché l'app scaricherà il file json più velocemente e il db locale verrà aggiornato più facilmente eviterà il sovraccarico di più usi Internet.

Basta creare un db vuoto inizialmente in base al db server e poi regolarmente aggiornato stessi da parte di recupero JSON

+2

Non sono sicuro del testo "scarica il file json più veloce". Ho fatto alcuni test/prototipazione: mentre il DB completo è di circa 5 MB, un file JSON contenente tutti i dati è di circa 8 MB. Oltre a 1,5 volte la dimensione, parsing di un enorme json potrebbe anche richiedere molto tempo. –

+0

il json conterrà tutti i record delle singole tabelle sotto forma di nome e valore del campo. Inoltre ci sarà più JSON per ogni tabella che verrà recuperata separatamente. – Maneesh

+1

Ok, in questo caso non riesco a vedere come sarà più efficiente del download di un database completo dal server. –

0

C'è un modo si può avere un campo JSON per ciascuna delle tabelle? Ad esempio, se hai una tabella chiamata utenti, usa una colonna chiamata "json" che memorizza il JSON per ciascuno degli utenti. In sostanza, conterrebbe le informazioni del resto dei campi.

Quindi, quando si scarica il delta in JSON, tutto ciò che si deve fare è inserire i JSON nelle tabelle.

Ovviamente con questo metodo, è necessario eseguire ulteriori operazioni per analizzare il JSON e creare il modello/oggetto da esso, ma sono solo 3-4 piccoli passaggi aggiuntivi.

+0

Non è così semplice come sembra. Le tabelle nel database sono collegate con chiavi esterne, quindi i dati in una tabella hanno poco senso da soli senza i dati di altre tabelle. I dati devono davvero essere tutti insieme. Quando interrogo i dati, utilizzo joins per ottenere le informazioni richieste. –