Sincronizza i dati tra l'app Android e il server web [chiuso]


262

Voglio sincronizzare i dati (come record db, media) tra un'app Android e un server. Se hai visto Evernoteo applicazioni simili, capirai sicuramente cosa intendo.

Ho qualche domanda (immagina di voler sincronizzare i record DB):

  1. Ogni utente ha una parte dello spazio del server per se stesso (come Evernoteo Dropbox). Forse l'utente crea nuovi record per cellulare e crea nuovi record nel server. Come posso abbinare questi record insieme? Se ci sono record con lo stesso ID Quali algoritmi mi consigliate?

  2. Tranne JSON , esiste un modo per inviare dati tra dispositivo cellulare e server?

  3. Se SyncAdapter e ContentProvider possono risolvere i miei problemi, ti prego di spiegarmi esattamente. (Se potessi offrirmi alcuni esempi o tutorial per me O qualsiasi consiglio o parola chiave per aiutare ad ampliare / guidare anche la mia ricerca sarebbe apprezzata).


1
Per prima cosa devi capire (decidere) il tuo protocollo di comunicazione con il server - quindi - quali dati puoi trasferire e come.
hovanessyan,

Questo è importante per me, trasferire i dati SQLlite. ma vorrei sapere come trasferire altri dati. Non capisco la tua cattiveria riguardo al protocollo. per favore, spiega di più.
Omid Nazifi,


1
provare konysync, un prodotto di konylabs che fornisce soluzioni end-to-end su varie piattaforme (android, windows, ios), server web, fornitori di dati (salesforce, fornitori di sap), database (sqlserver, mysql ...)
saimadan,

Risposte:


311

Cercherò di rispondere a tutte le tue domande rispondendo alla domanda più ampia: come posso sincronizzare i dati tra un server web e un'app Android?


La sincronizzazione dei dati tra il tuo server web e un'app Android richiede un paio di componenti diversi sul tuo dispositivo Android.

Conservazione persistente:

Questo è il modo in cui il telefono memorizza effettivamente i dati che riceve dal server web. Un possibile metodo per raggiungere questo obiettivo è scrivere il proprio ContentProvider personalizzato supportato da un database Sqlite. Un tutorial decente per un fornitore di contenuti può essere trovato qui: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

Un ContentProvider definisce un'interfaccia coerente per interagire con i dati memorizzati. Potrebbe anche consentire ad altre applicazioni di interagire con i tuoi dati se lo desideri. Dietro ContentProvider potrebbe esserci un database Sqlite, una cache o qualsiasi meccanismo di archiviazione arbitrario.

Mentre consiglierei sicuramente l'uso di ContentProvider con un database Sqlite, è possibile utilizzare qualsiasi meccanismo di archiviazione basato su Java desiderato.

Formato di scambio dati:

Questo è il formato che usi per inviare i dati tra il tuo server web e la tua app Android. I due formati più popolari in questi giorni sono XML e JSON. Quando scegli il tuo formato, dovresti pensare a quale tipo di librerie di serializzazione sono disponibili. So che è disponibile una fantastica libreria per la serializzazione json chiamata gson: https://github.com/google/gson , anche se sono sicuro che esistono librerie simili per XML.

Servizio di sincronizzazione

Avrai bisogno di una sorta di attività asincrona che può ottenere nuovi dati dal tuo server e aggiornare il contenuto mobile per riflettere il contenuto del server. Ti consigliamo inoltre di avvisare il server ogni volta che apporti modifiche locali al contenuto e desideri riflettere tali modifiche. Android fornisce il pattern SyncAdapter come un modo per risolvere facilmente questo pattern. Dovrai registrare gli account utente, quindi Android eseguirà molta magia per te e ti consentirà di sincronizzarti automaticamente. Ecco un buon tutorial: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


Per quanto riguarda il modo in cui ti identifichi se i record sono gli stessi, in genere creerai elementi con un ID univoco che memorizzi sia sul dispositivo Android che sul server. Puoi usarlo per assicurarti di riferirti allo stesso riferimento. Inoltre, puoi archiviare attributi di colonna come "updated_at" per assicurarti di ottenere sempre i dati più aggiornati o di non scrivere accidentalmente su dati appena scritti.


3
Che dire di una grande quantità di dati? come posso sincronizzare?
Pratik Butani,

4
Molto ben spiegato, ho solo una nota ... SyncAdapter -> "esegui molta magia". Spero che lo stai riferendo come magia nera ... è totalmente malvagio.
MRodrigues

@MRodrigues: SyncAdapter potrebbe essere magia nera per lo sviluppatore, ma fa ancora magia per stabilità e funzionalità, è molto più meglio di altre librerie
Milad Metias,

2
Cosa richiede lo stesso servizio web per sincronizzarlo con un dispositivo Android? È possibile con la primavera?
jublikon,

58

Se pensiamo a oggi , la risposta accettata è troppo vecchia. Come sappiamo che abbiamo molte nuove librerie che possono aiutarti a realizzare questo tipo di applicazione.

Dovresti imparare i seguenti argomenti che ti aiuteranno sicuramente:

  • SyncAdapter: il componente dell'adattatore di sincronizzazione nella tua app incapsula il codice per le attività che trasferiscono i dati tra il dispositivo e un server. In base alla pianificazione e ai trigger forniti nell'app, il framework dell'adattatore di sincronizzazione esegue il codice nel componente dell'adattatore di sincronizzazione.

  • Realm : Realm è un database mobile: un sostituto per SQLite e Core Data.

  • Retrofit Client HTTP sicuro per i tipi per Android e Java di Square, Inc. Deve imparare un retrofit per un modo intelligente di usare

E la tua logica di sincronizzazione per database come: Come sincronizzare il database SQLite sul telefono Android con il database MySQL sul server?

Buona fortuna a tutti i nuovi studenti. :)


Il collegamento a un retrofit a-smart-way-to-use è morto
Greg Holst,

@GregHolst aggiornato.
Pratik Butani,

3
Ancora giù. O richiede l'accesso? Archive.org
ce l'

24

Se lo scrivi tu stesso, questi sono alcuni dei punti da tenere a mente

Autenticazione corretta tra il dispositivo e Sync Server

Un protocollo di sincronizzazione tra il dispositivo e il server. Di solito andrà in 3 fasi, autenticazione, scambio di dati, scambio di stato (quali operazioni hanno funzionato e quali non sono riuscite)

Scegli il formato del tuo payload. Suggerisco XML basato su SyncML mescolato con formato basato su JSON per rappresentare i dati effettivi. Quindi SyncML per il protocollo e JSON per i dati effettivi scambiati. L'utilizzo di JSON Array durante la manipolazione dei dati è sempre preferito in quanto è facile accedere ai dati utilizzando JSON Array.

Tenere traccia delle modifiche ai dati sia sul client che sul server. Puoi mantenere un log delle modifiche degli ID che cambiano e raccoglierli durante una sessione di sincronizzazione. Inoltre, cancella il log delle modifiche poiché gli oggetti vengono sincronizzati correttamente. Puoi anche utilizzare una variabile booleana per confermare lo stato della sincronizzazione, ovvero l'ultima volta della sincronizzazione. Sarà utile per gli utenti finali identificare l'ora in cui è stata eseguita l'ultima sincronizzazione.

È necessario disporre di un modo per comunicare dal server al dispositivo per avviare una sessione di sincronizzazione quando i dati cambiano sul server. È possibile utilizzare C2DM o scrivere la propria comunicazione persistente basata su tcp. L'approccio tcp è molto semplice

Un modo per replicare le modifiche dei dati su più dispositivi

E, ultimo ma non meno importante, un modo per rilevare e gestire i conflitti

Spero che questo aiuti come un buon punto di partenza.


14

@Grantismo fornisce una grande spiegazione sull'insieme. Se desideri sapere chi sta effettivamente facendo queste cose, ti suggerisco di dare un'occhiata a come ha fatto google per l'app Google IO del 2014 (vale sempre la pena dare un'occhiata al codice sorgente di queste app che rilasciano. molto da imparare da lì).

Ecco un post sul blog a riguardo: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

In sostanza, sul lato dell'applicazione: GCM per la segnalazione, Sync Adapter per il recupero dei dati e la corretta comunicazione con Content Provider che renderà le cose persistenti (sì, isola il DB dall'accesso diretto da altre parti dell'app).

Inoltre, se desideri dare un'occhiata al codice del 2015: https://github.com/google/iosched


Il codice sorgente per l'app Google IO è abbastanza utile IMO!
Richeek,

10

Ad esempio, si desidera sincronizzare la tabella todoTableda MySqlaSqlite

In primo luogo, creare un nome di colonna version (type INT)in todoTableper entrambi SqliteeMySql inserisci qui la descrizione dell'immagine

In secondo luogo, creare un nome di tabella database_versioncon un nome di colonnacurrentVersion(INT)
inserisci qui la descrizione dell'immagine

In MySql, quando si aggiunge un nuovo elemento todoTableo un elemento di aggiornamento, è necessario aggiornare la versione di questo articolo da +1 e anche aggiornare ilcurrentVersion inserisci qui la descrizione dell'immagine

In Android, quando si desidera eseguire la sincronizzazione (tramite il pulsante di sincronizzazione premere manualmente o un servizio eseguito con periodo di tempo):

SqliteInvierai la richiesta con currentVersion (attualmente è 1) al server.
Quindi nel server, trovi quale articolo MySqlha un valore di versione maggiore di SqlitecurrentVersion (1) quindi risposta ad Android (in questo esempio l'elemento 3 con versione 2 risponderà ad Android)

In SQLite, aggiungerai o aggiornerai un nuovo elemento todoTablee aggiornerai la versione corrente


1
La tua idea è geniale, ma non riesco ancora a capire bene il design del tavolo. Oltre ai servizi di riposo e al corretto servizio di sincronizzazione, funziona
Ahesanali Suthar,


3

un modo per ottenere ciò è disporre di un'applicazione lato server in attesa dei dati. I dati possono essere inviati utilizzando HttpRequestoggetti in Java oppure è possibile scrivere la propria TCP/IPutilità di trasferimento dati. I dati possono essere inviati utilizzando il JSONformato o qualsiasi altro formato che ritieni adatto. Inoltre, i dati possono essere crittografati prima di inviarli al server se contengono informazioni riservate. Tutto ciò che l'applicazione server deve fare è solo attendere HttpRequestsche arrivi e analizzi i dati e li memorizzi dove vuoi.


Come controllare i dati aggiornati nell'app e nel server locali? e come fondersi insieme? Non è bene che io invii tutti i record di JSON o altro all'applicazione per unirli. cosa ne pensi?
Omid Nazifi,

2
è possibile utilizzare un flag, ad esempio "sul server" con un int / bool 1/0 per sì o no. quando viene inviato un record / file / blocco di dati, verificare la riuscita sul server e capovolgere il bit su Sì. quindi se stai usando qualcosa come SQLite, puoi fare una cosa tipo "SELECT * FROM my_table DOVE inviato = 0" per inviare nuovi record
Evan R.

1

Suggerirei di usare un protocollo binario di webservice simile a quello dell'Assia . Funziona molto bene e hanno un'implementazione Android. Potrebbe essere un po 'pesante ma dipende dall'applicazione che stai costruendo. Spero che questo ti aiuti.


1

@Grantismo offre un'ottima panoramica dei componenti di sincronizzazione Android.

La libreria SyncManagerAndroid offre una semplice implementazione della sincronizzazione bidirezionale da collegare al framework di sincronizzazione Android (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.