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?
Datensynchronisation mit Datenbankserver
-
-
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:
Code
Alles anzeigenLokale dataID's sammeln, bei denen _synchronised=0 gilt Remote dataID's sammeln, Aufruf http://www.meinServer.de/sqlapi/dataIDs Beide ID-Listen vergleichen und umsortieren: Kommt nur lokal vor: in Liste 'upload' Kommt nur remote vor: in Liste 'download' Kommt bei beiden vor: in Liste 'sync' Für jede dataID in Liste 'upload' Für jeden dazugehörigen Datensatz Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data Lokalen Datensatz auf _synchronised=1 setzen Für jede dataID in Liste 'download' Für jeden dazugehörigen Datensatz Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815} Lokalen Datensatz mit den Werten des Resultats erstellen und _synchronised=1 setzen Für jede dataID in Liste 'sync' Für jeden dazugehörigen Datensatz: Aufruf http://www.meinServer.de/sqlapi/compare?dataID=id{z.B. 0815}×tamp=ts(z.B. 1329214099} Teste Resultat Veraltet: Aufruf http://www.meinServer.de/sqlapi/data?dataID=id{z.B. 0815} Lokalen Datensatz mit den Werten des Resultats aktualisieren und _synchronised=1 setzen Break; Neuer: Aufruf http://www.meinServer.de/sqlapi/setData?dataID=id{z.B. 0815}&dataArray=data Lokalen Datensatz auf _synchronised=1 setzen Break;
-
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:
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.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!