Daten zwischen Android App und Webserver synchronisieren [geschlossen]

262

Ich möchte Daten (wie DB-Datensatz, Medien) zwischen einer Android-App und einem Server synchronisieren. Wenn Sie Evernoteoder ähnliche Anwendungen gesehen haben, verstehen Sie sicherlich, was ich meine.

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

  1. Jeder Benutzer hat einen Teil des Serverplatzes für sich (wie Evernoteoder Dropbox). Möglicherweise erstellt der Benutzer neue Datensätze per Handy und erstellt neue Datensätze auf dem Server. Wie kann ich diese Datensätze miteinander abgleichen? Wenn es Datensätze mit derselben ID gibt Welche Algorithmen schlagen Sie mir vor?

  2. Außer JSON , Gibt es eine Möglichkeit für Senden von Daten zwischen Mobiltelefon Gerät und dem Server?

  3. Wenn SyncAdapter und ContentProvider meine Probleme lösen können, erklären Sie dies bitte genau für mich. (Wenn Sie mir einige Beispiele oder Tutorials anbieten könnten ODER Ratschläge oder Schlüsselwörter zur Erweiterung / Anleitung meiner Suche wären ebenfalls willkommen).

Omid Nazifi
quelle
1
Zuerst müssen Sie Ihr Kommunikationsprotokoll mit dem Server herausfinden (entscheiden) - daher - welche Daten Sie wie übertragen können.
Hovanessyan
Das ist wichtig für mich, SQLlite-Daten zu übertragen. aber ich würde wissen wie andere daten übertragen werden. Ich verstehe Ihren Mittelwert über das Protokoll nicht. bitte mehr erklären.
Omid Nazifi
Mit Protokoll meine ich dies simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
Probieren Sie konysync aus, ein Produkt von konylabs, das End-to-End-Lösungen für verschiedene Plattformen (Android, Windows, iOS), Webserver, Datenanbieter (Salesforce, SAP-Anbieter) und Datenbanken (SQL Server, MySQL ...)
bietet

Antworten:

311

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 einige verschiedene Komponenten auf Ihrem Android-Gerät.

Dauerspeicher:

Auf diese Weise speichert Ihr Telefon tatsächlich die Daten, die es vom Webserver empfängt. Eine mögliche Methode, um dies zu erreichen, ist das Schreiben eines eigenen benutzerdefinierten ContentProviders, 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 für die Interaktion mit Ihren gespeicherten Daten. Auf Wunsch können auch andere Anwendungen mit Ihren Daten interagieren. Hinter Ihrem ContentProvider kann sich eine SQLite-Datenbank, ein Cache oder ein beliebiger Speichermechanismus befinden.

Obwohl ich sicherlich empfehlen würde, einen ContentProvider mit einer Sqlite-Datenbank zu verwenden, können Sie jeden gewünschten Java-basierten Speichermechanismus verwenden.

Datenaustauschformat:

In diesem Format senden Sie die Daten zwischen Ihrem Webserver und Ihrer Android-App. Die beiden derzeit beliebtesten Formate sind XML und JSON. Bei der Auswahl Ihres Formats sollten Sie überlegen, welche Serialisierungsbibliotheken verfügbar sind. Ich weiß sofort , dass es eine fantastische Bibliothek für die JSON-Serialisierung gibt, die gson heißt: https://github.com/google/gson , obwohl ich sicher bin, dass es ähnliche Bibliotheken für XML gibt.

Synchronisierungsdienst

Sie möchten eine Art asynchrone Aufgabe, mit der Sie neue Daten von Ihrem Server abrufen und den mobilen Inhalt aktualisieren können, um den Inhalt des Servers wiederzugeben. Sie möchten den Server auch benachrichtigen, wenn Sie lokale Änderungen am Inhalt vornehmen und diese Änderungen widerspiegeln möchten. Android bietet das SyncAdapter- Muster, um dieses Muster einfach zu lösen. Sie müssen Benutzerkonten registrieren, und dann führt Android viel Magie für Sie aus und ermöglicht Ihnen die automatische Synchronisierung. Hier ist ein gutes Tutorial: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


Wie Sie feststellen, 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 sicherzustellen, dass Sie sich auf dieselbe Referenz beziehen. Darüber hinaus können Sie Spaltenattribute wie "updated_at" speichern, um sicherzustellen, dass Sie immer die aktuellsten Daten erhalten oder nicht versehentlich über neu geschriebene Daten schreiben.

Grantismo
quelle
3
Was ist mit großen Datenmengen? Wie kann ich synchronisieren?
Pratik Butani
4
Sehr gut erklärt Ich habe nur eine Notiz ... SyncAdapter -> "viel Magie ausführen". Ich hoffe, Sie bezeichnen es als schwarze Magie ... es ist total böse.
MRodrigues
@ MRodrigues: SyncAdapter könnte schwarze Magie für den Entwickler sein, aber es mag immer noch Magie für Stabilität und Funktionalität, es ist viel besser als andere Bibliotheken
Milad Metias
2
Was benötigt der Webservice selbst, um ihn mit einem Android-Gerät zu synchronisieren? Ist es mit Frühling möglich?
Jublikon
58

Wenn wir an heute denken , ist die akzeptierte Antwort zu alt. Da wir wissen, dass wir viele neue Bibliotheken haben, die Ihnen bei der Erstellung dieser Art von Anwendungen helfen können.

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

  • SyncAdapter: Die Sync-Adapterkomponente in Ihrer App kapselt den Code für die Aufgaben, die Daten zwischen dem Gerät und einem Server übertragen. Basierend auf der Planung und den Triggern, die Sie in Ihrer App bereitstellen, führt das Synchronisierungsadapter-Framework den Code in der Synchronisierungsadapterkomponente 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. Erfahren Sie mehr über eine intelligente Nachrüstung

Und Ihre Synchronisierungslogik für Datenbanken wie: Wie synchronisiere ich SQLite-Datenbanken auf Android-Handys mit MySQL-Datenbanken auf Servern?

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

Pratik Butani
quelle
Der Link zu einer intelligenten Nachrüstung ist tot
Greg Holst
@ GregHolst aktualisiert.
Pratik Butani
3
Immernoch herunter. Oder erfordert Login? Archive.org hat es: web.archive.org/web/20160316222227/https://futurestud.io/blog/…
Bobpaul
24

Wenn Sie dies selbst schreiben, sind dies einige der Punkte, die Sie beachten sollten

Ordnungsgemäße Authentifizierung zwischen dem Gerät und dem Sync-Server

Ein Synchronisierungsprotokoll zwischen dem Gerät und dem Server. Es wird normalerweise in 3 Phasen durchgeführt: Authentifizierung, Datenaustausch, Statusaustausch (welche Vorgänge funktionierten und welche fehlgeschlagen sind)

Wählen Sie Ihr Nutzdatenformat. Ich schlage vor, SyncML-basiertes XML mit JSON-basiertem Format zu mischen, 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 von IDs verwalten, die sich ändern, und diese während einer Synchronisierungssitzung 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 zu bestätigen, dh den letzten Zeitpunkt der Synchronisierung. Für Endbenutzer ist es hilfreich, den Zeitpunkt zu ermitteln, zu dem die letzte Synchronisierung durchgeführt wurde.

Sie müssen über eine Möglichkeit verfügen, 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 dauerhafte TCP-basierte Kommunikation schreiben. Der TCP-Ansatz ist sehr nahtlos

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

Und last but not least eine Möglichkeit, Konflikte zu erkennen und zu behandeln

Hoffe das hilft als guter Ausgangspunkt.

openmobster
quelle
14

@Grantismo bietet eine großartige Erklärung für die Gesamt. Wenn Sie wissen möchten, wer diese Dinge tatsächlich tut, empfehlen wir Ihnen, einen Blick darauf zu werfen, wie sich Google für die Google IO-App von 2014 verhalten hat (es lohnt sich immer, einen genauen Blick auf den Quellcode dieser Apps zu werfen, die sie veröffentlichen viel von dort zu lernen).

Hier ist ein Blog-Beitrag darüber: 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, Synchronisierungsadapter für das Abrufen von Daten und das ordnungsgemäße Sprechen mit dem Inhaltsanbieter, um die Beständigkeit zu gewährleisten (ja, es isoliert die Datenbank vom direkten Zugriff von anderen Teilen der App).

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

Ciro Costa
quelle
Der Quellcode für die Google IO App ist IMO ziemlich nützlich!
Richeek
10

Beispielsweise möchten Sie die Tabelle todoTablevon MySqlbis synchronisierenSqlite

Erstellen Sie zunächst einen Spaltennamen version (type INT)in todoTablefür beide SqliteundMySql Geben Sie hier die Bildbeschreibung ein

Zweitens erstellen Sie einen Tabellennamen database_versionmit einem SpaltennamencurrentVersion(INT)
Geben Sie hier die Bildbeschreibung ein

In MySql, wenn Sie ein neues Element hinzuzufügen todoTableoder zu aktualisieren Artikel, müssen Sie die Version dieses Artikels durch ein Upgrade und auch das UpgradecurrentVersion Geben Sie hier die Bildbeschreibung ein

In Android, wenn Sie synchronisieren möchten (durch manuelles Drücken der Synchronisierungstaste oder eines Dienstlaufs mit Zeitraum):

Sie senden die Anfrage mit der Sqliteaktuellen Version (derzeit 1) an den Server.
Dann finden Sie auf dem Server, welches Element MySqleinen Versionswert hat, der größer als SqlitecurrentVersion (1) ist, und antwortet dann auf Android (in diesem Beispiel antwortet das Element 3 mit Version 2 auf Android).

In SQLitefügen Sie ein neues Element hinzu oder aktualisieren es todoTableund aktualisieren die aktuelle Version

Phan Van Linh
quelle
1
Ihre Idee ist brillant, kann aber das Tischdesign immer noch nicht richtig verstehen. Zusammen mit
Ruhediensten
6

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

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

Es ist ein sehr einfacher und benutzerfreundlicher serverseitiger Datenbankdienst, der eine großartige clientseitige API für Android bietet

Kyle
quelle
Was sind die kostenlosen Pläne, die das Angebot bietet?
Prakhar Mohan Srivastava
12
http://parse.com/ wird heruntergefahren.
Chintan Rathod
4
Sie können weiterhin die parse.com-Funktionalität verwenden, aber auf Ihrem eigenen Server haben sie
OpenSourced
3

Eine Möglichkeit, dies zu erreichen, besteht darin, eine serverseitige Anwendung zu haben, die auf die Daten wartet. Die Daten können mithilfe von HttpRequestObjekten in Java gesendet werden oder Sie können Ihr eigenes TCP/IPDatenübertragungsprogramm schreiben . Daten können in einem JSONFormat oder einem anderen Format gesendet werden , das Sie für geeignet halten. Außerdem können Daten vor dem Senden an den Server verschlüsselt werden, wenn sie vertrauliche Informationen enthalten. Alles, was die Serveranwendung tun muss, ist nur darauf zu warten HttpRequests, dass sie hereinkommt, die Daten analysiert und an einem beliebigen Ort speichert.

Mayank
quelle
Wie überprüfe ich Daten, die in der lokalen App und auf dem Server aktualisiert wurden? und wie zusammenführen? Es ist nicht gut, dass ich alle Datensätze von JSON oder irgendetwas an den Antrag zum Zusammenführen sende. Was denken Sie?
Omid Nazifi
2
Sie können ein Flag verwenden, z. B. "on server" mit einem int / bool 1/0 für yes oder no. Wenn ein Datensatz / eine Datei / ein Datenblock gesendet wird, überprüfen Sie den Server auf Erfolg und drehen Sie das Bit auf Ja. Wenn Sie dann so etwas wie SQLite verwenden, können Sie eine Sache vom Typ "SELECT * FROM my_table WHERE sent = 0" ausführen, um neue Datensätze zu senden
Evan R.
1

Ich würde vorschlagen, ein binäres Webservice-Protokoll zu verwenden, das Hessisch ähnlich ist . Es funktioniert sehr gut und sie haben eine Android-Implementierung. Es kann etwas schwer sein, hängt jedoch von der Anwendung ab, die Sie erstellen. Hoffe das hilft.

Neo
quelle
1

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

Die SyncManagerAndroid-Bibliothek bietet eine einfache 2-Wege-Synchronisierungsimplementierung zum Einbinden in das Android Sync-Framework (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

Sean
quelle