web-dev-qa-db-de.com

Synchronisiere Daten zwischen Android App und Webserver

Ich möchte Daten (wie db record, media) zwischen einer Android App und einem Server synchronisieren. Wenn Sie Evernote oder ähnliche Anwendungen gesehen haben, verstehen Sie sicherlich, was ich bedeuten.

Ich habe eine Frage (stellen Sie sich vor, wir möchten DB-Datensätze synchronisieren):

  1. Jeder Benutzer hat einen Teil des Serverraums für sich selbst (z. B. Evernote oder Dropbox). Möglicherweise erstellt der Benutzer neue Datensätze über das Mobiltelefon und erstellt neue Datensätze auf dem Server. Wie kann ich diese Datensätze zusammenbringen? Wenn es Datensätze mit derselben ID gibt Welche Algorithmen schlagen Sie mir vor?

  2. Außer [~ # ~] json [~ # ~] Gibt es eine Möglichkeit, Daten zwischen dem Mobiltelefon und dem Server zu senden? =

  3. Wenn SyncAdapter und ContentProvider meine Probleme lösen können, erklären Sie mir dies bitte genau . (Wenn Sie mir einige Beispiele oder Tutorials anbieten könnten OR Ratschläge oder Stichwörter zur Erweiterung/Anleitung meiner Suche wären auch willkommen).

251
Omid Nazifi

Ich werde versuchen, alle Ihre Fragen zu beantworten, indem ich die größere Frage beantworte: Wie kann ich Daten zwischen einem Webserver und einer Android App) synchronisieren?


Das Synchronisieren von Daten zwischen Ihrem Webserver und einer Android App erfordert ein paar verschiedene Komponenten auf Ihrem Android Gerät.

Dauerspeicher:

Auf diese Weise speichert Ihr Telefon die Daten, die es vom Webserver empfängt. Eine Möglichkeit, dies zu erreichen, besteht darin, einen eigenen benutzerdefinierten ContentProvider zu schreiben, der von einer SQLite-Datenbank unterstützt wird. Ein anständiges Tutorial für einen Inhaltsanbieter finden Sie hier: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

Ein ContentProvider definiert eine konsistente Schnittstelle zur Interaktion mit Ihren gespeicherten Daten. Auf Wunsch können auch andere Anwendungen mit Ihren Daten interagieren. Hinter Ihrem ContentProvider könnte sich eine SQLite-Datenbank, ein Cache oder ein beliebiger Speichermechanismus befinden.

Zwar würde ich auf jeden Fall empfehlen, einen ContentProvider mit einer SQLite-Datenbank zu verwenden, aber Sie könnten jeden gewünschten Java -basierten Speichermechanismus verwenden.

Datenaustauschformat:

Dies ist das Format, das Sie zum Senden der Daten zwischen Ihrem Webserver und Ihrer App Android=) verwenden. Die beiden derzeit am häufigsten verwendeten Formate sind XML und JSON. Bei der Auswahl des Formats sollten Sie überlegen, welche Art von Format Sie verwenden möchten Ich weiß, dass es eine fantastische Bibliothek für die json-Serialisierung gibt, die gson heißt: https://github.com/google/gson , obwohl ich mir sicher bin, dass ähnliche Bibliotheken für existieren XML.

Synchronisierungsdienst

Sie möchten eine asynchrone Aufgabe, mit der Sie neue Daten von Ihrem Server abrufen und den mobilen Inhalt aktualisieren können, um den Inhalt des Servers widerzuspiegeln. Sie sollten den Server auch benachrichtigen, wenn Sie lokale Änderungen am Inhalt vornehmen und diese Änderungen widerspiegeln möchten. Android stellt das SyncAdapter Muster zur Verfügung, um dieses Muster einfach zu lösen. Sie müssen Benutzerkonten registrieren und dann Android führt eine Menge Magie für Sie aus und ermöglicht Ihnen die automatische Synchronisierung. Hier ist ein gutes Tutorial: http: // www .c99.org/2010/01/23/Schreiben-an-Android-Sync-Provider-Teil-1 /


Wenn Sie feststellen möchten, ob die Datensätze identisch sind, erstellen Sie normalerweise Elemente mit einer eindeutigen ID, die Sie sowohl auf dem Android Gerät als auch auf dem Server speichern. Sie können dies verwenden, um dies sicherzustellen Sie verweisen auf dieselbe Referenz. Außerdem können Sie Spaltenattribute wie "updated_at" speichern, um sicherzustellen, dass Sie immer die neuesten Daten erhalten oder nicht versehentlich neu geschriebene Daten überschreiben.

307
Grantismo

Wenn wir heute an denken , ist akzeptierte Antwort zu alt. Da wir wissen, dass wir viele neue Bibliotheken haben, die Ihnen helfen können, diese Art von Anwendung zu erstellen.

Sie sollten folgende Themen lernen, die Ihnen sicherlich helfen werden:

  • SyncAdapter: Die Synchronisierungsadapterkomponente in Ihrer App kapselt den Code für die Aufgaben, die Daten zwischen dem Gerät und einem Server übertragen. Basierend auf den von Ihnen in Ihrer App bereitgestellten Zeitplänen und Triggern führt das Synchronisationsadapter-Framework den Code in der Synchronisationsadapter-Komponente aus.

  • Realm : Realm ist eine mobile Datenbank: ein Ersatz für SQLite & Core Data.

  • Nachrüstung Typensicherer HTTP-Client für Android und Java von Square, Inc. Must Learn a-smart- Nachrüstmöglichkeit

Und Ihre Synchronisationslogik für die Datenbank sieht folgendermaßen aus: Wie synchronisiert man die SQLite-Datenbank auf Android Telefon mit der MySQL-Datenbank auf dem Server?

Viel Glück für alle neuen Lernenden. :)

Wenn Sie dies selbst schreiben, sollten Sie einige Punkte beachten

Richtige Authentifizierung zwischen dem Gerät und dem Sync Server

Ein Synchronisierungsprotokoll zwischen dem Gerät und dem Server. Es wird in der Regel in 3 Phasen durchgeführt: Authentifizierung, Datenaustausch, Statusaustausch (welche Operationen haben funktioniert und welche sind fehlgeschlagen).

Wählen Sie Ihr Nutzlastformat. Ich schlage vor, dass SyncML-basiertes XML mit JSON-basiertem Format gemischt wird, um die tatsächlichen Daten darzustellen. Also SyncML für das Protokoll und JSON für die tatsächlich ausgetauschten Daten. Die Verwendung von JSON Array während der Bearbeitung der Daten wird immer bevorzugt, da der Zugriff auf Daten mit JSON Array einfach ist.

Verfolgen Sie Datenänderungen auf Client und Server. Sie können ein Änderungsprotokoll mit IDs verwalten, die sich während einer Synchronisierungssitzung ändern und abrufen. Löschen Sie außerdem das Änderungsprotokoll, wenn die Objekte erfolgreich synchronisiert wurden. Sie können auch eine boolesche Variable verwenden, um den Synchronisationsstatus, d. H. Den letzten Zeitpunkt der Synchronisation, zu bestätigen. Endbenutzer können den Zeitpunkt der letzten Synchronisierung ermitteln.

Sie müssen eine Möglichkeit haben, vom Server zum Gerät zu kommunizieren, um eine Synchronisierungssitzung zu starten, wenn sich Daten auf dem Server ändern. Sie können C2DM verwenden oder Ihre eigene permanente TCP-basierte Kommunikation schreiben. Der TCP-Ansatz ist sehr nahtlos

Eine Möglichkeit, Datenänderungen auf mehreren Geräten zu replizieren

Und nicht zuletzt eine Möglichkeit, Konflikte zu erkennen und zu bewältigen

Hoffe das hilft als guter Ausgangspunkt.

24
openmobster

@Grantismo bietet eine großartige Erklärung für das Gesamtbild. Wenn Sie wissen möchten, wer diese Dinge tatsächlich tut, sollten Sie sich ansehen, wie sich Google für die Google IO App von 2014 verhalten hat (es lohnt sich immer, einen tiefen Blick auf die Quelle zu werfen Code dieser Apps, die sie veröffentlichen (von dort kann man viel lernen).

Hier ist ein Blog-Beitrag dazu: http://Android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Im Wesentlichen auf der Anwendungsseite: GCM für die Signalisierung, Sync Adapter für das Abrufen von Daten und die ordnungsgemäße Kommunikation mit dem Inhaltsanbieter, wodurch die Dinge dauerhaft bleiben (ja, die Datenbank wird vom direkten Zugriff von anderen Teilen der App isoliert).

Wenn Sie sich auch den Code für 2015 ansehen möchten: https://github.com/google/iosched

14
Ciro Costa

Beispielsweise möchten Sie die Tabelle todoTable von MySql nach Sqlite synchronisieren.

Erstellen Sie zunächst einen Spaltennamen version (type INT) in todoTable für Sqlite und MySqlenter image description here

Zweitens erstellen Sie einen Tabellennamen database_version Mit einem Spaltennamen currentVersion(INT)
enter image description here

Wenn Sie in MySql ein neues Element zu todoTable hinzufügen oder ein Element aktualisieren, müssen Sie die Version dieses Elements um +1 und also aktualisieren die currentVersionenter image description here

In Android, wenn Sie synchronisieren möchten (durch manuelles Drücken der Sync-Taste oder eines Dienstes, der mit einer bestimmten Zeit ausgeführt wird):

Sie senden die Anfrage mit der Sqlite currentVersion (aktuell ist es 1) an den Server.
Dann finden Sie im Server, welches Element in MySql einen Versionswert größer als Sqlite currentVersion (1) hat, und antworten dann auf Android (in diesem Beispiel antwortet das Item 3 mit Version 2 auf Android)

In SQLite werden Sie neue Elemente zu todoTable hinzufügen oder aktualisieren und die aktuelle Version aktualisieren

7
Phan Van Linh

Schauen Sie sich parseplatform.org an. Es ist ein OpenSource-Projekt.

(Sie können auch ein kommerzielles Paket anfordern, das unter back4app.com erhältlich ist.)

Es ist ein sehr unkomplizierter und benutzerfreundlicher serverseitiger Datenbankdienst, der eine großartige clientseitige Android API bietet

6
Kyle

eine Möglichkeit, dies zu erreichen, ist eine serverseitige Anwendung, die auf die Daten wartet. Die Daten können mit HttpRequest Objekten in Java) gesendet werden, oder Sie können Ihr eigenes TCP/IP - Dienstprogramm für die Datenübertragung schreiben. Die Daten können mit JSON Format oder jedes andere Format, das Sie für geeignet halten. Auch Daten können verschlüsselt werden, bevor sie an den Server gesendet werden, wenn sie vertrauliche Informationen enthalten. Die Serveranwendung muss nur warten, bis HttpRequests eingeht und Analysieren Sie die Daten und speichern Sie sie an einem beliebigen Ort.

3
Mayank

@Grantismo bietet einen großartigen Überblick über Android Synchronisierungskomponenten.

Die SyncManagerAndroid-Bibliothek bietet eine einfache 2-Wege-Synchronisierungsimplementierung, die in das Android= Sync-Framework (AbstractThreadedSyncAdapter.OnPerformSync) eingefügt werden kann.

https://github.com/sschendel/SyncManagerAndroid

1
Sean

Ich würde vorschlagen, ein binäres Webservice-Protokoll zu verwenden, das Hessisch ähnelt. Es funktioniert sehr gut und es gibt eine Android) -Implementierung. Es mag etwas schwer sein, hängt aber von der Anwendung ab, die Sie erstellen. Hoffe, das hilft.

1
Neo