Come sincronizzare i dati dello stesso utente su più dispositivi

3

Sto lavorando su una piccola app di fitness in cui l'utente (che è autenticato con un server) potrebbe creare il proprio piano di allenamento che verrà sincronizzato con un server.

Il problema è che se l'utente ha installato l'app su più dispositivi, ha modificato il titolo di un piano di allenamento sul dispositivo A quando era offline e poi ha modificato il titolo dello stesso piano di allenamento sul dispositivo B, che era online, quindi sincronizzato con il server. Quindi l'utente è andato online sul dispositivo A che si sincronizza automaticamente con il server. Ciò significherebbe che il titolo precedente verrà sincronizzato con il server di un utente.

Dettagli:

  • L'utente è autenticato con google accedi / fb accedi usando i loro sdks ufficiali.

  • Durante l'autenticazione, i seguenti dati vengono aggiunti al server: ID, nome, sesso, email, età, peso, altezza, follower, seguito, piattaforma.

  • Tutti i dati inclusi i dati dell'utente sono memorizzati in un database mysql

  • Si accede a tutti i dati dal server usando php

  • I dati dell'utente sul dispositivo Android sono memorizzati in Preferenze condivise e i dati relativi ai piani di allenamento dell'utente sono archiviati nel Database SQLite.

La mia domanda è, come faccio a sincronizzare normalmente i dati dello stesso utente su più dispositivi. Ho già un'idea di come potrei farlo, ma so che i pacchetti di app prima del mio hanno raggiunto lo stesso problema e potrebbe esserci un modo normale / standard per farlo? Grazie :)

    
posta edwinj 24.02.2016 - 00:53
fonte

2 risposte

4

Qui ci sono davvero due preoccupazioni, e sono per lo più problemi risolti nel dominio del calcolo distribuito.

Come posso rilevare i dati fuori sincrono?

I tuoi oggetti dovrebbero avere il versioning integrato. Ogni volta che un oggetto viene salvato nell'archivio permanente (sia esso un DB relazionale, NoSQL, OODB, qualunque esso sia) si incrementa la versione.

Se un'app va a sincronizzare le sue modifiche con il cloud e rileva che la versione nel cloud non corrisponde alla versione che sta modificando, sa che i dati sono stati modificati in due posizioni senza sincronizzare tra loro.

Esempio:

  1. I dispositivi A e B si sincronizzano entrambi sul cloud e scaricano la versione 1 di un oggetto.
  2. L'utente modifica l'oggetto sul dispositivo A, quindi si sente frustrato perché il WiFi è rotto.
  3. L'utente accede al dispositivo B e modifica i dati.
  4. Il dispositivo B si sincronizza con il cloud: entrambi i record sono in versione 1, quindi carica i dati e incrementa la versione in 2.
  5. L'utente torna al dispositivo A, che ora è connesso.
  6. L'app vede che ha la versione 1 del record, ma il cloud ha la versione 2 - si sincronizzerebbe, tranne che ci sono cambiamenti locali. Oops! Questo è un problema ed è stato facilmente rilevato.

Come posso risolvere i conflitti?

A seconda della natura dei dati può essere facile o difficile risolvere questo conflitto.

Il software di controllo del codice sorgente funziona in modo simile, in cui più utenti possono modificare i file in modo indipendente. Il server tiene traccia degli ID di revisione. Quando un utente va a sincronizzarsi, controlla le revisioni per vedere se c'è un aggiornamento. In genere, se un aggiornamento non è in conflitto (ovvero le stesse linee non sono state modificate da utenti separati) può essere risolto automaticamente dal software. In caso contrario, potrebbe richiedere l'intervento dell'utente (le diverse strategie VCS funzionano in modo leggermente diverso ma il flusso di lavoro concettuale è simile).

Questo in realtà non è molto diverso dallo scenario che hai presentato. Ci sono due fattori chiave qui:

  1. Lo stesso utente sta modificando su entrambi i dispositivi, quindi decidere cosa fare dovrebbe essere abbastanza semplice per l'utente.

  2. I dati sono discreti . Proprio come le linee in un file di testo, questi semplici campi su una tabella sono entità di dati separate ma complete.

Un'opzione sarebbe quella di visualizzare una schermata con il record, evidenziando i campi in conflitto che sono diversi nelle due versioni. Fornire le seguenti opzioni:

  1. Forza le modifiche locali al cloud, ignorando la versione più recente (questa sarebbe ora la versione 3 nell'esempio sopra).

  2. Elimina le modifiche locali e accetta la versione cloud (2).

  3. Modifica il record locale, quindi salva e sincronizza come versione 3.

risposta data 24.02.2016 - 06:11
fonte
0

Non posso fare a meno di pensare che se hai un utente che non è connesso su un dispositivo, aggiorna le sue informazioni su un altro dispositivo collegato, quindi torna al primo dispositivo, la prima cosa che è succederà, quel primo dispositivo vorrà sincronizzarsi con il server. A quel punto, l'app disconnessa deve prendere quello che dice il server o dare all'utente la possibilità di sovrascrivere. La mia domanda sarebbe: "come viene l'utente a connettere il dispositivo B senza prima connettere il dispositivo A?" Guarda come funziona il controllo del codice sorgente ... se apporti modifiche sul posto di lavoro, dimentica di sincronizzare, apportare modifiche a casa e sincronizzare, quando torni al lavoro, avrai dei conflitti di sincronizzazione da risolvere. La sincronizzazione di più dispositivi con un database centrale funziona allo stesso modo. Immagino che per ottenere una risposta più dettagliata dovresti fornire più dettagli sulla situazione in questione. A seconda della circostanza, potresti scrivere in "unione logica", ma potrebbe diventare piuttosto complicato ...

    
risposta data 24.02.2016 - 01:08
fonte

Leggi altre domande sui tag