27

Ho un'app per Android che gestisce un database SQLite locale di diverse posizioni geografiche.Dati di sincronizzazione Android tra gli utenti

Ora vorrei collegare detta banca dati nella "nuvola" per realizzare il seguente:

  • una scarica iniziale di tutto, quando l'applicazione viene prima installato (o su richiesta)

  • nuove posizioni che sono state aggiunte localmente devono essere caricate nel cloud (automaticamente)

  • il database online deve essere controllato occasionalmente per le nuove voci online e scaricato nel database locale.

Ho un numero di problemi nel realizzare questo.

Il primo è semplicemente come farlo. Penso che coinvolga contentProviders e syncProviders, ma non sono esattamente sicuro di come. Devo duplicare il mio database SQLite in un contentProvider o ho fatto un errore nella progettazione sottostante per utilizzare direttamente un database, invece che attraverso un fornitore di contenuti personalizzato?

In secondo luogo, i record di posizione non possono essere semplicemente copiato su e giù dalla banca dati on-line, dato che avranno numeri ID contrastanti. Ho diverse tabelle relazionali, come "tag" che riguardano un id-tag con un id-location. I miei id-tag non corrisponderanno necessariamente ai tag-id di altri utenti. Lo stesso con gli ID di posizione. Quindi ci sarà bisogno di essere coinvolti in qualche logica nel trasferimento. Dove/come dovrebbe essere gestito correttamente? È questo il ruolo di contentResolver? (Non sono sicuro di cosa si tratta in realtà)

In terzo luogo, che cosa succede nel caso in cui 2 agli utenti di aggiungere la stessa posizione nello stesso momento (magari con descrizioni diverse e particolari)? Esiste una best practice per unire questi record con?

Infine, qual è il modo più semplice per costruire/host il componente online? Questa parte è completamente nuova per me. Posso semplicemente inserire il database master in una cartella pubblica di Dropbox o devo creare un'app web PHP personalizzata da zero? O esiste una soluzione preconfezionata che renderebbe più semplice questa parte?

+0

Vedo che la domanda è stata posta 3 anni fa e ha una risposta accettata. Puoi per favore approfondire quali ulteriori informazioni hai bisogno per la taglia? – RocketRandom

risposta

22

Si dovrebbe usare ContentProvider e SyncAdapters. Si dovrebbe:

  • avvolgere le funzionalità di database con l'ContentProvider interfaccia
  • Setup un SyncService corrispondenza l'autorità del ContentProvider
  • Nella tua SyncAdapter specializzazione, si ignorare onPerformSync()
  • Usa SharedPreferences di storage per mantenere traccia dei tuoi parametri di sincronizzazione es tempo lastSync, ecc.

    final SharedPreferences syncMeta = 
            mContext.getSharedPreferences("sync:" + account.name, 0); 
    long lastSyncTime = syncMeta.getLong(LAST_SYNC, 0); 
    long lastServerSyncTime = syncMeta.getLong(SERVER_LAST_SYNC, 0); 
    
  • Questo può facilmente dire se la prima sincronizzazione e si può fare il trattamento iniziale qui

  • Potrai scrivere il vostro algoritmo qui per la sincronizzazione cioè un modo/a doppio senso.
  • Trovo utile registrare i timestamp e l'ID del database del server nei record Android per aiutare con la sincronizzazione. Questo può aiutarti con la tua strategia di fusione.
  • Utilizzare ContentProvider qui per le operazioni DB. ContentProviders fornisce un modo uniforme per accedere ai tuoi dati dalla tua app e anche dagli adattatori di sincronizzazione. Notificheranno il sistema di aggiornamenti in modo tale che il framework e la sincronizzazione del programma. Possono anche essere utili come interfacce pubbliche dei tuoi dati ad altre app se scegli di farlo.

  • Inoltre, utilizzando SyncService si sta risparmiando batteria. Il sistema utilizzerà rete solletica a calci delle operazioni di sincronizzazione e il suo meglio se vengono dosati insieme per tutte le applicazioni, invece di ogni app che svegliano il sistema

Infine,

Ci sono due campioni che si dovrebbe cercare a. Essi coprono praticamente tutto quello che ho spiegato

  1. JumpNote - http://code.google.com/p/jumpnote/source/browse/
  2. SampleSyncAdapter - http://developer.android.com/resources/samples/SampleSyncAdapter/index.html

Entrambe queste applicazioni utilizzano Google App Engine per la componente cloud. È facile iniziare, quindi sicuramente esplorare le opzioni.

+0

Grazie per i campioni. Conosci qualche tutorial online che lo riguardi? (il codice è ottimo, ma ci vorrà un po 'di tempo per guadare), e la pagina developer.android.com non dice molto. – Brent

+0

Vedo una serie di 2 parti qui - http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/. La parte 2 è più rilevante. Quel tutorial usa account personalizzati. Potresti semplicemente fare affidamento sugli account com.google. – Anirudh

-1

Prima creare un DB locale in Android. e ur il salvataggio dei dettagli dei dettagli della posizione. dopo averlo salvato, invia al database cloud/server.

Successivamente occasionalmente è necessario sincronizzare quale database cloud/server. quindi scrivi un servizio in Android come prendi un intervallo specifico e sincronizzalo con clound/server DB.

fusione in modo da prendere un timestamp in una tabella. e controllare l'ora e aggiornare di conseguenza.