Autore Topic: Sincronizzare database  (Letto 442 volte)

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Sincronizzare database
« il: 24 Settembre 2013, 08:40:40 CEST »
0
Sono ancora alla fase "concettuale" del mio problema, per il codice è presto, ma intanto voglio capire come la cosa può funzionare.

Allora io intendo implementare la sincronizzazione dei dati tra dispositivi diversi (diciamo smartphone A e tablet B ma potrebbero essere di più) e con un database centrale remoto (R su server remoto).

Il problema è che l'utente per qualche suo strano capriccio potrebbe modificare i dati contemporaneamente (o quando offline) su più dispositivi e le modifiche potrebbero essere in conflitto tra loro. Oppure caso più semplice aggiunge un record alla stessa tabella da due dispotivi diversi relativi a dati diversi e quindi quei record avranno stesso _id ma dovrebbero poi convivere nel database sincronizzato.

Immagino debba esserci un database master, che sarà quello remoto, con cui tutti i dispositivi devono confrontarsi, ma poi come colgo le modifiche e soprattutto come risolvo i conflitti? Esiste qualche esempio già fatto o qualcosa da vedere/leggere? O qualcuno che ha già realizzato una cosa del genere e può darmi qualche consiglio?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Sincronizzare database
« Risposta #1 il: 24 Settembre 2013, 09:04:08 CEST »
0
Gmail funziona così: il database master è ovviamente il server di Gmail, tu da offline puoi scrivere un messaggio, poi appena vai online e sincronizzi il messaggio viene spedito al server centrale e solo allora trova il suo posto nel database master. Tieni quindi una tabella locale di dati "da sincronizzare", che passano a dati sincronizzati solo dopo l'invio al database centrale.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline crbin1

  • Utente junior
  • **
  • Post: 61
  • Respect: +6
    • labeltodo
    • Mostra profilo
    • Do Androids Dream of Electric Sheep?
  • Dispositivo Android:
    Galaxy Nexus
Re:Sincronizzare database
« Risposta #2 il: 24 Settembre 2013, 09:42:36 CEST »
0
Ok, e fin qua mi torna. Poi ci vorrà una tabella remota con i dispositivi collegati e le modifiche nel db centrale da sincronizzare con i vari dispositivi, in modo da propagare le modifiche avvenute in un dispositivo a tutti gli altri collegati.

Ti faccio un esempio di un mio dubbio. Mettiamo un db semplice con 2 tabelle, Attività e Promemoria, con un rapporto 1 a molti ogni attività può avere più promemoria.

Situazione iniziale con db sincronizzato con 30 attività. L'utente aggiunge l'attività 31 sul tablet e gli associa un promemoria, poi senza sincronizzare aggiunge un'attivita sul telefono diversa dalla precedente ma a cui il telefono dà ancora il numero 31 perché non può sapere di quello che è successo sul tablet offline. Poi avviene la sincronizzazione del telefono e il master assegna il 31 all'attività del telefono. Nel momento in cui il tablet prova a sincronizzare si trova che la propria attività sul master non avrà lo stesso numero perché se il master la aggiunge avrà il 32 e il master anche il promemoria lo deve associare alla 32 mentre sul tablet resta assciato alla 31. Quindi quello che mi preoccupa è il fatto che è impossibile mantenere gli stessi _id su tutti i dispositivi e diventa quindi complicato gestire la sincronizzazione.

Avevo pensato di utilizzare come super_id quello master e aggiungere a tutte le tabelle dell'applicazione locale anche un master_id e utilizzare quello per la sincronizzazione e il normale _id per l'operatività locale, che ne dici?


Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Sincronizzare database
« Risposta #3 il: 24 Settembre 2013, 09:49:22 CEST »
0
Il numero deve poterlo assegnare solo il database centrale, e lo fa al momento della sincronizzazione. Eventi o promemoria locali non sincronizzati devono rimanere nel limbo, diventano "veri" solo dopo che il server centrale le ha accettate (come la gmail).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store