Datensynchronisation mit Datenbankserver

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datensynchronisation mit Datenbankserver

    Hallo,
    mit welchen Mitteln lässt sich am besten ein System aufbauen, bei dem eine clientseitige SQLite Datenbank mit einer serverseitigen Datenbank abgeglichen wird, sofern letztere erreichbar ist? Macht es Sinn, eine solche Anwendung besser als Webanwendung aufzubauen?
  • Die Idee klingt ganz gut.

    Die serverseitige SQL Datenbank würde ich in der Tat über ein Webinterface ansteuern.
    Ist halt angenehmer als direkter Datenbankzugriff, da du mehr Kontrolle über die reingereichten Daten hast.

    PHP und Python sei Dank brauchst du da nicht mal ein GUI für basteln sondern kannst das über die GET- und POST-Requests regeln.
    Leider haben die Skripte eine gewisse Ausführungszeit. Es wäre also sinnvoll, irgendwo in der lokalen SQLite Datenbank ein Feld '_synchronised' zu pflegen, welches bei jeder Änderung des Datensatzes natürlich wieder auf 'false' gesetzt wird.

    Ebenso sollte der SyncService meiner Erfahrung nach jeden zu synchronisierenden Datensatz einzeln abgleichen. Dauert zwar länger, ist aber stabiler, sollte zwischendrin die Verbindung wegbrechen.

    Natürlich würde die Synchronisation in mehreren Schritten verlaufen müssen. Du bräuchtest eine Datensatz-ID, die unabhängig des Primary Keys ist und einen Timestamp der letzten Änderung.

    Dann geht es sinngemäß so:

    Quellcode

    1. Lokale dataID's sammeln, bei denen _synchronised=0 gilt
    2. Remote dataID's sammeln, Aufruf http://www.meinServer.de/sqlapi/dataIDs
    3. Beide ID-Listen vergleichen und umsortieren:
    4. Kommt nur lokal vor: in Liste 'upload'
    5. Kommt nur remote vor: in Liste 'download'
    6. Kommt bei beiden vor: in Liste 'sync'
    7. Für jede dataID in Liste 'upload'
    8. Für jeden dazugehörigen Datensatz
    9. Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data
    10. Lokalen Datensatz auf _synchronised=1 setzen
    11. Für jede dataID in Liste 'download'
    12. Für jeden dazugehörigen Datensatz
    13. Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815}
    14. Lokalen Datensatz mit den Werten des Resultats erstellen und _synchronised=1 setzen
    15. Für jede dataID in Liste 'sync'
    16. Für jeden dazugehörigen Datensatz:
    17. Aufruf http://www.meinServer.de/sqlapi/compare?dataID=id{z.B. 0815}&timestamp=ts(z.B. 1329214099}
    18. Teste Resultat
    19. Veraltet:
    20. Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815}
    21. Lokalen Datensatz mit den Werten des Resultats aktualisieren und _synchronised=1 setzen
    22. Break;
    23. Neuer:
    24. Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data
    25. Lokalen Datensatz auf _synchronised=1 setzen
    26. Break;
    Alles anzeigen
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.

    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«
  • Vielen Dank für diese ausführliche Antwort :)

    Dann würde in dem Fall sicher eine HTML5-basierte Anwendung Sinn machen, die man dann auch gleich auf andere mobile OS portieren kann.

    Welche Methoden gibt es denn grundsätzlich, um eine mobile Anwendung mit dem Server kommunizieren zu lassen? Neben der genannten Methode würden mir noch SOAP und JSON einfallen, aber welche nun am sichersten und schnellsten ist, kann ich nicht beurteilen. Das ganze müsste dann noch am besten in einem mobilen VPN laufen.
  • Kommt auch drauf an, was du auf dem Server alles machen kannst. Lucas hat recht: im einfachsten Fall kannst du die Daten einfach über HTTP rüberschieben, das geht immer und die Weiterbearbeitung mit PHP oder Python ist relativ einfach.

    Bei SOAP müsstest du die Daten in XML verpacken, auf dem Server könntest du dann in einem einfachen SAX-Parser die Datensätze rausfischen und dann in die DB schubsen. Das gilt dann aber auch für die Rück-Richtung. Bei SAX auf Android muss man übrigens leider immer den Driver angeben, die Doku ist da etwas unvollständig, hier der Hinweis bevor du dich totsuchst:

    Java-Quellcode

    1. XMLReader xr = XMLReaderFactory.createXMLReader("org.xmlpull.v1.sax2.Driver");


    JSON oder verpacken der Daten mit interface Serializable für deine Datenklassen lohnt nur, wenn du auf dem Server auch Java machen kannst.

    In jedem Fall musst du der App eine Antwort mit Erfolg-Meldung schicken, aber rechne auch damit, dass vielleicht mal die Rückmeldung nicht ankommt - gerade wenn man noch nicht ganz wieder zu Hause ist, ist die WLAN-Verbindung noch nicht stabil...

    Ob du HTML5 oder native Apps schreibst kommt auch drauf an, was du noch alles in deiner Anwendung machst und wie gut du dich in den anderen Entwicklungsumgebungen zurechtfindest.
    Das Leben kann so hart sein, man muss nur richtig wollen!!!