Ich möchte Daten (wie DB-Datensatz, Medien) zwischen einer Android-App und einem Server synchronisieren. Wenn Sie Evernote
oder ä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):
Jeder Benutzer hat einen Teil des Serverplatzes für sich (wie
Evernote
oderDropbox
). 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?Außer JSON , Gibt es eine Möglichkeit für Senden von Daten zwischen Mobiltelefon Gerät und dem Server?
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).
quelle
Antworten:
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.
quelle
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. :) :)
quelle
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.
quelle
@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
quelle
Beispielsweise möchten Sie die Tabelle
todoTable
vonMySql
bis synchronisierenSqlite
Erstellen Sie zunächst einen Spaltennamen
version (type INT)
intodoTable
für beideSqlite
undMySql
Zweitens erstellen Sie einen Tabellennamen
database_version
mit einem SpaltennamencurrentVersion(INT)
In
MySql
, wenn Sie ein neues Element hinzuzufügentodoTable
oder zu aktualisieren Artikel, müssen Sie die Version dieses Artikels durch ein Upgrade und auch das UpgradecurrentVersion
In
Android
, wenn Sie synchronisieren möchten (durch manuelles Drücken der Synchronisierungstaste oder eines Dienstlaufs mit Zeitraum):Sie senden die Anfrage mit der
Sqlite
aktuellen Version (derzeit 1) an den Server.Dann finden Sie auf dem Server, welches Element
MySql
einen Versionswert hat, der größer alsSqlite
currentVersion (1) ist, und antwortet dann auf Android (in diesem Beispiel antwortet das Element 3 mit Version 2 auf Android).In
SQLite
fügen Sie ein neues Element hinzu oder aktualisieren estodoTable
und aktualisieren die aktuelle Versionquelle
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
quelle
Eine Möglichkeit, dies zu erreichen, besteht darin, eine serverseitige Anwendung zu haben, die auf die Daten wartet. Die Daten können mithilfe von
HttpRequest
Objekten in Java gesendet werden oder Sie können Ihr eigenesTCP/IP
Datenübertragungsprogramm schreiben . Daten können in einemJSON
Format 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 wartenHttpRequests
, dass sie hereinkommt, die Daten analysiert und an einem beliebigen Ort speichert.quelle
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.
quelle
@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
quelle