2013-03-22 17 views
21

Sto iniziando a configurare il modello dei dati di base per un'app su larga scala e speravo di ottenere feedback sui metodi/tecniche di sincronizzazione appropriati quando si tratta di database del server e funzionalità offline.iOS - Best practice per la sincronizzazione dei database core e dei database dei server

Io uso PHP e mySQL per il mio server web/database.

so già come collegare, ricevere i dati, archivio di dati di base, ecc ecc sto cercando di più per aiutare con le metodologie e casi particolari di rilevamento modifiche dei dati a:

a) garantire l'applicazione e il server è sincronizzato durante l'utilizzo online e offline (ad esempio, l'attività offline verrà attivata una volta tornato online). B) Ottimizza la velocità di salvataggio dei dati nell'app.

Le mie domande principali sono:

Qual è il modo migliore per controllare quali dati nuovi/aggiornati in app deve ancora essere sincronizzato (dopo l'uso offline)?

(vale a dire in tutte le mie entità di dati di base ho inserito un attributo 'isSynchronized' di tipo BOOL, quindi l'aggiornamento a 'YES' una volta inviato e la risposta viene inviata di nuovo dal server). È questo il modo migliore?

Qual è il modo migliore per ottimizzare la velocità di salvataggio dei dati dal server ai dati principali?

(ad esempio, come è possibile aggiornare solo i dati nei dati di base più vecchi rispetto a quelli presenti nel database del server senza iterare attraverso ciascuna entità e aggiornarli ogni volta)? È possibile senza aggiungere una colonna del database del server per tracciare i timestamp di aggiornamento su OGNI tabella?

Ancora una volta, so già come scaricare i dati e archiviarli su Core Data, sto solo cercando aiuto con le migliori pratiche per garantire la sincronizzazione tra database di app e server garantendo tempi di elaborazione ottimizzati.

+0

vedere http://stackoverflow.com/questions/413086/ algoritmo del modello di sincronizzazione client-server – danh

risposta

9

Memorizzo un timestamp dell'ultima modifica nel database su entrambi i record di dati principali sul telefono e le tabelle mysql sul server.

Il telefono ricerca tutto ciò che è cambiato dall'ultima sincronizzazione e lo invia al server con una data/ora dell'ultima sincronizzazione, e il server risponde con tutto ciò che è cambiato alla sua fine dal timestamp di sincronizzazione fornito.

Le prestazioni sono un problema quando molti record sono cambiati. Faccio la sincronizzazione su uno sfondo NSOpuction che ha il proprio contesto oggetto gestito. Quando il thread in background ha terminato di apportare modifiche al contesto dell'oggetto gestito, c'è un'API per unire tutte le modifiche nel contesto dell'oggetto gestito del thread principale, che può essere configurato in modo da eliminare tutte le modifiche in caso di conflitti causati da l'utente che cambia i dati mentre la sincronizzazione sta succedendo. In tal caso, attendo solo alcuni secondi e poi provo di nuovo a eseguire una sincronizzazione.

Su hardware precedente anche dopo molte ottimizzazioni è stato necessario interrompere completamente la sincronizzazione se l'utente inizia a fare cose nell'app. Stava semplicemente usando troppe risorse di sistema. Penso che i dispositivi iOS più moderni siano probabilmente abbastanza veloci da non dover più farlo.

(a proposito, quando ho detto "un sacco di dischi hanno cambiato" Intendevo 30.000 o giù di file in fase di aggiornamento o inseriti sul telefono)

+0

idem. Inoltre, uso una data di modifica in ciascuna delle mie entità in cui memorizzo l'ora dell'ultima chiamata server riuscita. Su ogni chiamata API, lo trasmetto al server, che ha trigger che impostano una colonna simile in ogni tabella ogni volta che qualcosa cambia. E io uso un modello a tre contesti come in [questa domanda] (http://stackoverflow.com/questions/10542097/implementing-fast-and-efficient-core-data-import-on-ios-5) per gestire gli aggiornamenti in modo asincrono. – enjayem

+0

Sto anche gestendo la sincronizzazione utilizzando gli ultimi dati sincronizzati e datetimestamp dei record di tabella. –

+1

Come si può essere sicuri che il timestamp del telefono e il timestamp del server utilizzino esattamente la stessa ora. Ad esempio se il timestamp del telefono è 10 secondi prima del server e c'è un cambiamento tra quel momento, i dati andranno persi –

Problemi correlati