2013-11-02 7 views
31

Ich beginne mein erstes PhoneGap-Projekt mit AngularJS. Es ist eine datenbankgestützte App, die eine REST-API als Backend verwendet. Zunächst einmal werde ich keine Daten lokal speichern, so dass es ohne Internet nicht viel zu tun gibt.Strategien zum Synchronisieren von Daten mit dem Server in PhoneGap

Ich möchte jedoch, dass es Daten lokal speichern und synchronisieren, wenn Internet verfügbar ist, da ich weiß, dass ich persönlich die Internetverbindungen auf meinem Telefon zeitweise deaktivieren (Flugzeuge, schwache Batterie), oder keine Balken haben . Ich habe mich gefragt, ob Sie mich auf einige gute Ressourcen für diese Art der Synchronisierung hinweisen könnten. Einige empfohlene Bibliotheken? Oder vielleicht einige Diskussionen über die Fallstricke und wie man sie umrundet. Ich habe ein bisschen gegoogelt, aber ich denke gerade jetzt, ich weiß nicht, welche Fragen ich stellen muss.

Auch meine Absicht, es zuerst Internet-abhängig zu bauen, und dann fügen Sie Synchronisieren .... Ist das eine gute Idee, oder schieße ich mich in den Fuß? Muss ich es von Anfang an synchronisieren?

Ich hatte jemanden vorgeschlagen, die App als lokal-nur zuerst zu erstellen, eher, dass der Internet-Teil zuerst, der eine gewisse Logik hat. Der Remote-Speicher ist mir wichtig. Ich weiß, dass die Entscheidung dort viel mit meinen Zielen für die App zu tun hat, aber von dem Standpunkt, dies zu bauen, mit dem Ziel, lokaler Speicher + Internetspeicher und Zweiwege-Synchronisierung, was wird einfacher? Oder macht es überhaupt einen Unterschied?

Zunächst denke ich über die Verwendung von UUIDs statt sequenziellen ganzzahligen Primärschlüsseln. Ich habe auch darüber nachgedacht, jedem Gerät eine ID zuzuweisen, die auf allen von ihm erzeugten Schlüsseln vorangestellt ist, aber das scheint heikel zu sein. Jeder verwendete beide Techniken? Gedanken?

Ich denke, ich brauche ein gutes System zu sagen, welche Daten synchronisiert wurden. Auf der Client-Seite, ich denke, alle Datensätze, die erstellt/bearbeitet werden, können für die Synchronisierung gekennzeichnet werden. Aber auf der Serverseite haben Sie mehrere Clients, das würde also nicht funktionieren. Ich denke, Sie könnten einen last_updated Timestamp haben, und alles synchronisieren, synchronisieren Sie die letzte erfolgreiche Synchronisierung.

Was ist mit Aufzeichnungen an mehreren Stellen bearbeitet? Wenn zwei Clients bearbeiten und dann synchronisieren möchten, haben Sie einige Unklarheiten beim Zusammenführen, z. B. beim Zusammenführen von Zweigen in git oder anderen Versionskontrollsystemen. Wie gehst du damit um? Ich denke, Git tut es, indem er Diffs von jedem Commit speichert. Ich denke, du könntest Diffs speichern? Je mehr ich darüber nachdenke, desto komplizierter klingt es. Überdenke ich es oder überlege es?

Was ist mit clientseitigem Speicher? Ich habe über SQLite oder das lokale PhoneGap-Speicherding (http://docs.phonegap.com/en/1.2.0/phonegap_storage_storage.md.html) nachgedacht. Empfehlungen? Die Synchronisierung erfolgt über eine REST-API, wobei JSON ausgetauscht wird. Daher dachte ich über etwas nach, das die Daten tatsächlich als JSON speichert, oder etwas JSON-ähnliches, das leicht zu konvertieren ist, wäre schön. Auf der anderen Seite, wenn ich ein Daten-Diff-Format austauschen muss, muss ich das vielleicht speichern?

+0

Hat jemand das benutzt? http://pouchdb.com/ scheint für viele meiner Bedenken relevant zu sein, würde aber gerne Ihre Gedanken hören, wenn Sie diesen Weg gegangen sind? – eimajenthat

Antwort

26

Lassen Sie mich die Antwort auf Ihre Frage basierend auf meiner Erfahrung mit dem Sync-Teil bieten, da ich nicht genug Erfahrung mit PhoneGap habe, so wird die Frage über PhoneGap lokalen Speicher v SQLite überspringen.

Ich frage mich, ob Sie mich auf einige gute Ressourcen für diese Art der Synchronisierung zeigen könnten. Einige empfohlene Bibliotheken?

Es gibt eine Reihe von Open-Source-Projekten zum Synchronisieren der PhoneGap-App mit dem Remote-Server. Aber Sie müssen sie wahrscheinlich für Ihre eigenen Bedürfnisse anpassen oder Ihre eigenen Synchronisierungsfunktionen implementieren. Im Folgenden habe ich einige der Open-Source-Projekte aufgelistet. Sie müssen sie bereits kennen, wenn Sie im Internet suchen.

Zusätzlich könnten Sie die anderen Optionen in Betracht ziehen, aber das hängt von Ihrem Server-Seite:

Auch meine Absicht es Internet-abhängige ersten, zu bauen und dann die Synchronisierung hinzuzufügen .... Ist das eine gute Idee oder schieße ich mir selbst in den Fuß? Muss ich es von Anfang an synchronisieren?

Ich glaube, dass die Synchronisierungsfunktion eher ein zusätzliches Modul ist und nicht eng mit dem Rest Ihrer Geschäftslogik verbunden sein sollte. Sobald Sie über die Teststrategie für Ihre Synchronisierung nachdenken, werden Sie feststellen, dass es einfacher ist, dies zu testen, wenn Ihre Synchronisierungsfunktion vom Hauptcode entkoppelt ist.

Ich denke, dass Sie Ihre App so schnell wie möglich mit der minimal erforderlichen Funktionalität ohne Synchronisierung starten können. Aber denken Sie besser über Ihre Architektur und die Art und Weise nach, wie Sie die Synchronisierungsfunktion im Voraus hinzufügen.

Zunächst denke ich an die Verwendung von UUIDs anstelle von sequentiellen Ganzzahl-Primärschlüsseln. Ich habe auch darüber nachgedacht, jedem Gerät eine ID zuzuweisen, die auf allen von ihm erzeugten Schlüsseln vorangestellt ist, aber das scheint heikel zu sein. Jeder verwendete beide Techniken? Gedanken?

Das hängt von Ihren Projektspezifikationen und speziell von Ihrer Serverseite ab. Zum Beispiel erlauben Azure Mobile Services nur Integer-Typen für die Primärschlüssel. Obwohl eindeutige Identifikatoren als Primärschlüssel in verteilten Systemen ziemlich nützlich sind (hat auch einige Nachteile).

Im Zusammenhang mit der Zuweisung einer Geräte-ID - Ich bin mir nicht sicher, verstehe ich den Punkt, obwohl ich Ihre Projektspezifika nicht kenne. Sehen Sie sich den Synchronisierungsalgorithmus an, der in unserem System verwendet wird (bidirectional sync using REST between multiple Android clients and central SQL Server).

Was ist mit Datensätzen, die an mehreren Stellen bearbeitet wurden? Wenn zwei Clients bearbeiten und dann synchronisieren möchten, haben Sie einige Unklarheiten beim Zusammenführen, z. B. beim Zusammenführen von Zweigen in git oder anderen Versionskontrollsystemen. Wie gehst du damit um? Ich denke, Git tut es, indem er Diffs von jedem Commit speichert. Ich denke, du könntest Diffs speichern? Je mehr ich darüber nachdenke, desto komplizierter klingt es. Überdenke ich es oder überlege es?

Hier müssen Sie darüber nachdenken, wie Sie mit der Konfliktlösung in Ihrem System umgehen.

Wenn die Wahrscheinlichkeit von Konflikten in Ihrem System hoch ist, z. Benutzer werden die gleichen Datensätze oft ändern.Dann sollten Sie besser, welche Felder (Spalten) der Datensätze in Ihrem Sync geändert worden verfolgen und dann, sobald der Konflikt erkannt wird:

  1. Iterate durch jedes geänderte Feld der Server-Seite Aufzeichnung in Konflikt
  2. vergleichen jedes geänderte Feld des Server-Datensatzes mit dem relevanten Feld des Clients.
  3. Wenn das Clientfeld nicht geändert wurde, gibt es keinen Konflikt, also überschreiben Sie es einfach mit dem Server.
  4. Sonst gibt es einen Konflikt, so speichern Sie den Inhalt beider Felder in einen temporären Bereich für den Bericht
  5. Am Ende der Synchronisierung erstellen Sie den Bericht der Datensätze im Konflikt.
+0

Die Idee hinter den Geräte-IDs ist, dass jedes Gerät seine eigenen sequenziellen IDs verwendet, denen jedoch eine eigene Geräte-ID vorangestellt ist. So würde zum Beispiel mein Gerät ID 1 bekommen, und Ihr würde 2 bekommen. Dann erstellen Sie Ich erstelle einen Datensatz mit ID 1, aber es wäre etwas wie 2-1 oder 2-00001, wenn Sie bevorzugen. Und dann, wenn ich meinen ersten Datensatz erstellt habe, wäre es 1-1 oder 1-00001. Jedes Gerät behält seine eigene Reihenfolge bei und erstellt IDs in der richtigen Reihenfolge, aber sie können zusammengeführt werden, da das Präfix sie unterscheidet. Ich mag diese Lösung nicht, obwohl ich nicht genau sagen kann, warum. – eimajenthat

+0

Viele tolle Informationen @Havrl. Vielen Dank! – eimajenthat

+0

Ich bin auf UUIDs gelehnt. Meine Server-Seite wird von mir festgelegt. Ich dachte zuerst an PostgreSQL oder MySQL, aber wie ich über CouchDB gelesen habe, klingt es zwingend. – eimajenthat

Verwandte Themen