27

Ich habe eine Android-App, die eine lokale SQLite-Datenbank von verschiedenen geografischen Standorten verwaltet.Android Synchronisierungsdaten zwischen Benutzern

Nun möchte Ich mag diese Datenbank in die „Wolke“ verbinden folgenden zu erreichen:

  • ein erster Download von allem, wenn die App zum ersten Mal installiert wird (oder auf Anfrage)

  • neue Standorte, die lokal hinzugefügt wurden, sollten automatisch in die Cloud hochgeladen werden

  • Die Online-Datenbank sollte gelegentlich auf neue Online-Einträge überprüft und in die lokale Datenbank heruntergeladen werden.

Ich habe eine Reihe von Problemen dabei.

Die erste ist einfach wie es geht. Ich denke, es betrifft ContentProvider und SyncProvider, aber ich weiß nicht genau, wie. Muss ich meine SQLite-Datenbank in einem contentProvider duplizieren oder habe ich im zugrunde liegenden Design einen Fehler gemacht, anstatt direkt über einen benutzerdefinierten Inhaltsanbieter eine Datenbank zu verwenden?

Zweitens können die Standortdatensätze nicht einfach von der Online-Datenbank auf- und abkopiert werden, da sie widersprüchliche ID-Nummern haben. Ich habe mehrere relationale Tabellen, wie "Tags", die eine Tag-ID mit einer Location-ID verknüpfen. Meine Tag-IDs stimmen nicht unbedingt mit den IDs anderer Benutzer überein. Gleiches mit Standort-IDs. Es wird also eine gewisse Logik bei der Übertragung geben müssen. Wo/wie soll das richtig gehandhabt werden?? Ist das die Rolle eines contentResolvers? (nicht sicher, was das wirklich ist)

Drittens, was passiert, wenn 2 Benutzer den gleichen Ort zur gleichen Zeit hinzufügen (vielleicht mit unterschiedlichen Beschreibungen und Details)? Gibt es eine Best-Practice für das Zusammenführen von diese Datensätze?

Schließlich, Was ist der einfachste Weg zum Erstellen/hosten der Online-Komponente? Dieser Teil ist alles neu für mich. Kann ich die Master-Datenbank einfach in einen öffentlichen Dropbox-Ordner legen oder muss ich eine eigene PHP-Web-App von Grund auf neu erstellen? Oder gibt es eine vorgefertigte Lösung, die diesen Teil einfacher macht?

+0

Ich sehe die Frage wurde vor 3 Jahren gestellt und hat eine akzeptierte Antwort. Kannst du bitte näher erläutern, welche weiteren Informationen du für das Kopfgeld benötigst? – RocketRandom

Antwort

22

Sie sollten unbedingt ContentProvider und SyncAdapters verwenden. Sie sollten:

  • Wickeln Sie Ihre Datenbank-Funktionalität mit der ContentProvider Schnittstelle
  • -Setup ein SyncService die Autorität des ContentProvider
  • In Ihrem SyncAdapter Spezialisierung passend, werden Sie onPerformSync()
  • Verwenden SharedPreferences Speicher außer Kraft setzen zu halten Verfolgen Sie Ihre Sync-Parameter z lastSync Zeit usw.

    final SharedPreferences syncMeta = 
            mContext.getSharedPreferences("sync:" + account.name, 0); 
    long lastSyncTime = syncMeta.getLong(LAST_SYNC, 0); 
    long lastServerSyncTime = syncMeta.getLong(SERVER_LAST_SYNC, 0); 
    
  • Dies kann man leicht feststellen, wenn sie die erste Synchronisierung und Sie können hier die anfängliche Behandlung tun

  • Sie Ihren Algorithmus hier für Sync heißt einen Weg/Zweiweg schreiben.
  • Ich finde es nützlich, Zeitstempel und Server-Datenbank-ID in Ihren Android-Datensätzen aufzuzeichnen, um bei der Synchronisierung zu helfen. Dies kann Ihnen bei Ihrer Zusammenführungsstrategie helfen.
  • Verwenden Sie den ContentProvider hier für DB-Operationen. ContentProvider bieten eine einheitliche Methode für den Zugriff auf Ihre Daten über Ihre App sowie für die Synchronisierung von Adaptern. Sie werden das System der Updates benachrichtigen, damit das Framework und der Zeitplan synchronisiert werden. Sie können auch als öffentliche Schnittstellen Ihrer Daten zu anderen Apps hilfreich sein, wenn Sie dies wünschen.

  • Mit SyncService sparen Sie auch Batterie. Das System wird Netzwerk verwenden kitzelt von Synchronisationsoperationen und seiner besten Seite zu treten, wenn sie für alle Anwendungen zusammen chargiert werden, anstatt jede App das System

Schließlich

Aufwachen

Es gibt zwei Proben sollten Sie achten beim. Sie decken so ziemlich alles, was ich

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

Beide Apps nutzen, Google App Engine für die Cloud-Komponente. Es ist einfach zu beginnen, also erkunden Sie diese Optionen.

+0

Danke für die Proben. Kennen Sie Online-Tutorials, die das abdecken? (Der Code ist großartig, wird aber eine Weile dauern), und die developer.android.com Seite sagt nicht viel. – Brent

+0

Ich sehe eine 2-teilige Serie hier - http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/. Teil 2 ist relevanter. Dieses Tutorial verwendet benutzerdefinierte Konten. Sie können sich einfach auf com.google-Konten verlassen. – Anirudh

-1

Zuerst erstellen Sie eine lokale DB in Android. und speichern Sie Details zu den Standortdetails. Nach dem Speichern senden Sie es an die Cloud/Server-DB.

Als nächstes muss U gelegentlich die Cloud/Server-DB synchronisieren. also schreibe einen Dienst in android wie ein bestimmtes Intervall nehmen und mit clound/server DB synchronisieren.

Zusammenführen so nehmen Sie einen Zeitstempel in einer Tabelle. und überprüfen Sie diesen Zeitstempel und aktualisieren Sie entsprechend.

Verwandte Themen