2010-06-02 16 views
7

Ho un'app di Core Data che diventerà un'applicazione universale iPhone/iPad.Sincronizzazione cloud tra app iPad/iPhone

Vorrei implementare la sincronizzazione del cloud in modo che un iPhone e un iPad che eseguono l'app possano condividere i dati. Sto pensando di usare lo recently released Dropbox API. Qualcuno ha qualche idea sul modo migliore per farlo? L'API Dropbox consente alle app di archiviare i file nel cloud. Quello che stavo pensando è stato quello di archiviare il database (sqlite) originale per l'app sul cloud e quindi scaricare quel database, ma poi mi sono reso conto che l'utilizzo di quel metodo avrebbe reso dolorosamente difficile unire le modifiche (anziché sostituire l'intero database).

Ogni pensiero è apprezzato. Grazie.

risposta

5

Se riesci a farla franca, il modo più semplice per fare la sincronizzazione (di gran lunga) è per avere tre copie dei tuoi dati localmente: la copia che hai caricato l'ultima volta ("vecchia"), la copia prodotta dalle modifiche locali ("mia") e la copia ora scaricata dal server ("loro").

Poi, ordinare tutti i record in tutti e tre i file e camminare attraverso di loro uno per uno:

  • se il vecchio == mio, usare il loro
  • altrimenti se vecchi loro ==, usare la mia
  • altrimenti hai un conflitto; fai qualcosa (ad esempio usa sempre il mio, alias "l'ultimo scrittore vince")

Nota che "mio" o "loro" o "vecchio" potrebbero non esistere. Le regole sopra si applicano ancora in quel caso; se il risultato che scegli è "non esiste", allora dovrai eliminare il record nel file di output.

Infine, caricare il file risultante sul server in modo che sia il database "loro" per il prossimo. Quindi copia il nuovo file nei tuoi database "vecchi" e "minieri" locali.

(Non ci sono più algoritmi di spazio-efficiente di quanto sopra ... ma non ci sono quelli più facili :) E lo spazio su disco è piuttosto a buon mercato al giorno d'oggi, in particolare se si comprime i file.)

+0

c'è qualche presa? – Yoo

+0

C'è sempre un problema :) – apenwarr

0

È possibile esaminare GameKit per condividere i dati. Altrimenti sembra che dovrai solo gestire la sincronizzazione con un file server intermedio.

+0

stavo considerando questa opzione, ma qual è il modo più semplice per unire le modifiche tra 2 database di Core Data? – indragie

+0

L'iPhone non supporta i servizi di sincronizzazione disponibili per OS X (http://developer.apple.com/iphone/library/technotes/tn2009/tn2152.html # SECSYNCING) quindi dovrai scrivere le tue routine. Cerca nell'aggiunta di un timestamp ai record e consenti all'utente di decidere la politica su come procedere con le sincronizzazioni (ad esempio, il record timestamp più recente viene inviato a tutti gli altri dispositivi). –

1

È possibile utilizzare un metodo diverso per la sincronizzazione. Qual è il tipo di dati con cui avrai a che fare?

Ho avuto molto successo utilizzando un back-end per binari leggeri.

+0

Solo alcuni semplici oggetti del modello (costituiti essenzialmente da NSStrings, NSArrays, ecc.) – indragie

+2

Se si ha familiarità con i binari, consultare il progetto ObjectiveResource. –

+0

Mi dispiace di avere solo un upvote per dare il commento di Frank Schmitt. – corprew

0

Probabilmente si desidera esportare i dati in un formato diverso dal formato nativo sqlite. Se stavo progettando qualcosa del genere, penso che il numero JSON sarebbe probabilmente il mio formato di scelta.

Non ho guardato all'API dropbox, ma supportano il caricamento e il download delle differenze di file, piuttosto che l'intero file, giusto? A seconda di come funziona l'API, forse la tua applicazione comprenderà il loro formato "diff" e lavorare con quello potrebbe essere più semplice ...

+0

La conversione dei dati in JSON non sarebbe un problema. Il problema che ho ancora è come unire le modifiche tra le due librerie in modo efficace. – indragie

+0

La sincronizzazione è un problema generalmente difficile, sfortunatamente. Se si desidera eseguire la sincronizzazione in entrambe le direzioni, è necessario mantenere una sorta di conteggio delle modifiche per ciascun record e adottare la versione "più recente" quando si uniscono. La vera sfida arriva nel gestire i conflitti in modo ragionevole. –

+0

Questo è quello che ho assunto, ho bisogno di capire un modo per risolvere i conflitti. Uno scenario specifico a cui sto pensando è che se il dispositivo A aveva un record ma poi è stato cancellato e il dispositivo B ha quel record ma non viene eliminato, non vorrei che il dispositivo A recuperi quel record quando sincronizzato .. è dura – indragie