Daten, Bilder und Datenbanken. Wie verknüpfen?

W

Weathon

Neues Mitglied
0
Hallo Leute,

Ich hab hier ja schon viel gelesen, hatte aber nie das Bedürfnis Fragen zu stellen bzw. das Wissen andere zu beantworten (ich hoffe das ändert sich :) )

Kurz zu meinem derzeitigen Wissensstand:
Ich mache derzeit ein Kolleg für Informatik (2 Jahre lang, Datenbanken, Programmieren, Netzwerktechnik usw.).
2 Semester habe ich bereits hinter mir, in Programmieren haben wir
ausschließlich in Java programmiert allerdings sind wir wohl nicht sehr weit
gekommen. Das einzige was ich in Android bisher gemacht habe, ist eine kleine
Rechner - App programmiert, einfach zum ausprobieren.

Nun zu dem Problem:
Wir müssen ein Diplomprojekt machen. Haben uns nun auch entschieden was wir machen, nämlich eine Android Applikation entwickeln, die folgendes kann:
Information geben. Bei einer wichtigen Entscheidung helfen (per Dropdown werden Eigenschaften ausgewählt, die die Auswahl einschränken soll).
Ein Foto machen, aktuelle GPS Position speichern und das ganze in eine DB hochladen. Die Uploads werden dann auf einer Karte bereitgestellt (mittels Fähnchen z.B.)

Zu meiner Frage:
Wie stelle ich das ganze am Besten an, wo ich Daten speichere und wie.
Meine Überlegung war, eine MySQL Datenbank auf einem Server anzulegen,
der die ganzen Eigenschaften enthält (Strings etc.)
Außerdem sollen die Fotos in der App (die quasi von vornherein da sind) leicht austauschbar sein, da stellt sich die Frage ob in die DB hinein (per BLOB?) oder extra irgendwohin? :)

Die Android App selbst soll auch eine Datenbank (sqlite) haben, in der dann die daten von der mysql db zwischengespeichert werden.
Außerdem soll in diese sqlite-DB auch das gemachte Foto mit den GPS daten abgespeichert werden (kein GPS-Tracking).
Diese sollten dann mit einem Service auf den Server geladen werden (in die mysql DB).

Was haltet ihr von der Vorgangsweise?
Wie empfiehlt ihr mir die Bilder abzuspeichern, ich hab schon so viel widersprüchliches gelesen (auf keinen Fall in die DB, doch das geht schon usw.)
Ist es klüger nur die Dateipfade in die DB zu speichern, und die Bilder liegen dann iwo auf dem Server?


Ich hoffe ich habe es irgendwie verständlich rüber gebracht, es kommt mir leider nicht so vor :/

An alle die es trotzdem geschafft haben, das ganze zu verstehen, erstmal vielen Dank für die Mühe und ich bin sehr gespannt auf eure Antworten :)

Liebe Grüße,
Weathon
 
Weathon schrieb:
Wie empfiehlt ihr mir die Bilder abzuspeichern, ich hab schon so viel widersprüchliches gelesen (auf keinen Fall in die DB, doch das geht schon usw.)
Ist es klüger nur die Dateipfade in die DB zu speichern, und die Bilder liegen dann iwo auf dem Server?
In Android auf keinen Fall Fotos die mit der Kamera aufgenommen wurden als Blob in die DB speichern, denn das wird mit Sicherheit zu Abstrüzen führen. Bezüglich Begründung zu dieser Behauptung verweise dich mal auf einen meiner früheren Beiträge zu diesem Thema: https://www.android-hilfe.de/forum/...-datenbank-speichern.580451.html#post-7746845
 
Hallo!

Was Du vor hast, klingt schon mal nach einer interessanten Übung!

Die Photographien als BLOB in einer SQL-Datenbank abzulegen ist jedoch tatsächlich keine so sehr gute Idee; und zwar aus technischen Gründen. Deine Datenbank kann niemals wissen, was Du als BLOB übergeben wirst, und deshalb werden die meisten Datenbank-Implementierungen den BLOB versuchen so lange wie möglich im Arbeitsspeicher vorzuhalten, bevor die Daten dann final in der Datenbank zu liegen kommen. Generell müssen Datenbanken, immer wenn es um BLOBs geht, intern einiges an Klimmzügen veranstalten. Gleichzeitig müßtest Du die Daten (Photo) jedoch ebenfalls mit deiner App im Arbeitsspeicher halten können, um diese an die Datenbank übergeben zu können. Da Arbeitsspeicher jedoch sehr begrenzt ist, vor allem auf mobilen Geräten, ist diese Vorgehensweise aus technischen Gründen eben nicht ganz ideal.
Datenbanken sind im Grunde ehr dazu gedacht, komplexe Beziehungen von Daten persistent herzustellen. Also vor allem '1 zu n' bzw. 'n zu m' Beziehungen. In deinem Fall jedoch hört sich das mehr nach einer einfachen 1:1 Beziehungen von Photo, geographische Information und Uhrzeit etc. an. Also nach etwas, das man ebenso gut auch in einem JASON / XML zuzüglich PHOTO-Datei abspeichern könnte, was möglicherweise auch eine ganz guter Ansatz wäre. Du würdest dir damit den lokalen SQL Anteil sparen, auch wenn das Projekt damit weniger 'Lerninhalt' aufweisen würde.
Diese Überlegungen gelten damit aber dann im selben Sinne auch für deine 'serverseitige' SQL-Datenbank (mySQL / ORACLE / INFORMIX / oder was auch immer).

Die zweite Frage die ich persönlich aufwerfen würde ist, ob es wirklich Sinn macht die Daten von einem Service synchronisieren zu lassen. An irgend einer Stelle müßte dieser Service getriggert werden, mit dem Übertragen zu beginnen. Nur wer macht das dann? Die App? Wenn das die App macht, weshalb bewerkstelligt diese dann die Übermittlung nicht selbst? Wenn es nicht die App macht, wann macht es der Service, bzw. weshalb wurden die Daten nicht sofort übertragen? Also an dieser Stelle ist mir zwar der technische Anspruch für deine Übungsaufgabe verständlich, doch ich bin mir nicht ganz sicher, ob der Ansatz auch gut wirklich angemessen ist. Falls das mobile Gerät aus Kostengründen nicht sofort die Daten übermitteln soll (G3/G4), sondern zu einem späteren Zeitpunkt eine kostengünstigere WLAN-Verbindung, dann macht das sicherlich Sinn. Nur braucht das eben noch lange keinen Service. In diesem Fall kannst Du ebenso gut auch mittels APP die Übermittlung anstoßen. Das ist zwar nicht so 'hübsch und anspruchsvoll', macht aber Sinn, denn da würde auch die erfolgreiche Übermittlung in der APP sichtbar sein, während ein Service im Hintergrund irgend etwas macht oder auch nicht macht, was wiederum dann an irgend einer Stelle kontrolliert werden müßte, um sicher gehen zu können, daß die Übermittlung auch stattgefunden hat, bzw. nicht stattfinden konnte, weil ... siehe 'blah schwatz' im Log des Service.
Ein Service würde, zumindest so wie ich das ad hoc verstehe, die Nutzung der Funktionalität, mache ein Photo, nehme GPS Position + Datum-Uhrzeit >> Persistenz >> Übermittlung, nicht unbedingt einfacher zu handhaben machen.
Das würde ich eventuell nochmal gründlich überdenken, ob dieses Konzept in dieser Form angemessen die gestellte Aufgabe lösen wird.

Was den technischen Ansatz angeht, also ganz generell das Daten sammeln, in eine lokale Datenbank speichern und diese mit einer oder mehreren Datenbanken synchronisieren, finde ich den grundsätzlich super! Klingt anspruchsvoll, und hat auch einiges an interessanten technischen Inhalten zu bieten.

Was ich noch nicht verstanden habe, werden die GEO-Koordinaten (Fähnchen) auf einer Karte in der APP angezeigt? Oder passiert dieser Teil zu einem anderen Zeitpunkt, anderenorts?
Falls in deiner APP auch angezeigt werden soll, so würde ich dir die Verwendung von SVG-tiny 1.1/1.2 für das Karten-Zeichnen empfehlen. SVG skaliert auf den unterschiedlichen Auflösungen/DPI-Dichten mobiler Geräte sehr einfach, weist ein kleines Speicherprofil auf und läßt sich mit der 2D Grafik-API auf Android auch toll umsetzen. Außerdem gibt dazu passend open-source-Projekte (Libraries) für Android. Google da mal nach 'androidsvg' bzw. 'svg-android', falls so etwas in dieser Richtung im Raume stehen sollte.

Tja, das wäre was mir persönlich spontan zu deinem Projekt so durch den Kopf geht. Um Missverständnisse zu vermeiden, dein Ansatz ist nicht etwa grundsätzlich falsch oder so, sondern meiner Ansicht nach nur nicht ganz optimal angesichts der technischen Rahmenbedingungen auf mobilen Geräten.

Ich wünsche dir jedenfalls viel Glück und gutes Gelingen für dein Projekt, und vielleicht helfen dir meine Einwände ja auch ein wenig, um einen für dich passenden Lösungsansatz zu finden!

Mfg, Andreas.
 
Zuletzt bearbeitet:
Vielen Dank für die raschen Antworten :)

@meganeura
Das mit den Bildern in der DB war auch nur eine Idee, aber ich denke die wird verworfen, da es einfach zu viel Negatives daran gibt, danke dafür ;)

@asagk1963
Gut, das mit den BLOBs hake ich jetzt einfach mal ab, aber danke für die Erklärung, das sind so Dinge die können dann noch schön in die Vorstudie und Entscheidungsfindung hinein :)

An JSON hatte ich auch schon gedacht, das habe ich mir so vorgestellt.
MYSQL - Datenbank -> PHP Schnittstelle, macht SQL Abfrage und speichert es in ein JSON-Array (kann man das so sagen?) -> Die Android App holt sich den JSON (per html POST oder?) und speichert diesen wiederum in die eigene SQLite DB.
Nur wie funktioniert das dann mit einem Bild?
Das ist nun jedenfalls der eine Weg um quasi die Daten die ich als Entwickler/Eigentümer der App mitgeben möchte (ich will sie nicht in den Ressourcen Ordner packen, denn ich will kein App Update erforderlich haben wenn ich einen neuen Datensatz einfüge)

Der andere Weg, wenn also der User (wobei es kein Login oder so geben wird), ein Foto macht und das ganze (GPS, Foto, Zusatzinfo) auf den Server soll, ist etwas komplizierter.
Ein Service war nur eine Idee, ich dachte mir es ist klüger das ganze über einen Service zu machen, dass quasi die App schon beendet werden kann.
Eine Möglichkeit wäre, dass man nur im WLAN uploaden kann, oder auch dass man zu dem Zeitpunkt gar keine Internetverbindung hat. Wie könnte ich das ganze dann mit der App und ohne Service lösen ohne dass der User z.B. darauf warten muss bis der Upload fertig ist und die App offen lassen muss?

Wenn dann jedenfalls die Daten hochgeladen werden (zu einem PHP-File (schnittstelle zu DB)), kommt das ganze wieder in eine MYSql DB (ist schon festgelegt dass es mysql ist). Von dort soll dann die Karte erstellt werden (in PHP/JavaScript), ich habe mir bisher folgendes angesehen.

Leaflet - a JavaScript library for mobile-friendly maps
Hier ein Beispiel dazu:
Apfelbaum | Mundraub.org

Die PHP/Javascript seite mit der Karte kann dann auch in der App aufgerufen werden.

Vielen Vielen Dank für deine Hilfe und Einwände,
je mehr Meinungen/Ideen desto besser. Außerdem stehe ich eben noch ganz am Anfang und hab nur Ideen, wo ich nicht weiß ob das (gut) umsetzbar ist.

Liebe Grüße,
Weathon
 
Hallo Weathon!

Ich würde gerne versuchen zunächst, was die Machbarkeit einer Umsetzung angeht, den technischen Transport von der Initiierung des Transports von Daten für den Moment voneinander getrennt voneinander zu betrachten, da sich der eine Teil auf deine technischen Möglichkeiten bezüglich Umsetzung, der andere auf die Benutzererfahrung (Usesability) der APP bezieht.

Was den Transport (Synchronisation der Daten) zwischen einer mobilen Maschine und einer oder mehrerer stationärer Maschinenen angeht, gibt es sicherlich sehr viele untschiedliche mögliche Ansätze.
Als triviales Beispiel: JSON + <photoname>.[jpg|png|...] werden zwischen mobiler und stationärer Maschine via FTP übertragen.
Ein komplexeres Beispiel: [JSON|XML] + <binary> (photo) werden zwischen mobiler und stationärer Maschine via WebSocket übermittelt.
Z.B. siehe: https://today.java.net/article/2010/04/26/html5-server-push-technologies-part-2

Und natürlich gäbe es da auch noch zahllose andere denkbare Ansätze... via PHP etc. pp.

Welche davon für dich konkret am geeignetsten sind, hängt sicherlich auch von deinen Implementierungsmöglichkeiten serverseitig (stationäre Maschine) ab, ob Du beispielsweise serverseitig Java laufen haben kannst usw.

Eine SQL Datenbank benögt deine mobile Maschine mit der APP jedenfalls nicht unbedingt. Im Grunde kostet das nur wertvolle Resourcen, solange die Daten lediglich erfasst werden. Sollen Daten (Photo/Karte) jedoch auch in der APP angezeigt werden, so macht die Datenbank wenigstens für die Geodaten Sinn, denn dann ließe sich ja sehr angenehm auf der Datenbank nach den entsprechenden Daten passend zu Koordinaten eines jeweilig angezeigten Kartenausschnitts suchen.

Was das Triggern einer Synchronisation angeht, so stellt sich mir persönlich die Frage, wäre es zumutbar, wenn der Benutzer mit der mobilen Maschine (Handy/Tablet + APP) ein Photo aufnimmt, dieses zusammen mit Datum/Uhrzeit/GPS-Koordiante/etc. von der APP in einem Verzeichnis zwischen gespeichert wird, und zu einem späteren Zeitpunkt von dem Benutzer explizit via APP (xyz.jpg + xyz.json) an die stationäre Maschine übertragen wird?
Hübscher ist sicherlich, wenn das mobile Gerät kontrolliert, ob z.B. eine WLAN-Verbindung besteht, und dann einen Transport der Photodatei, sowie der JSON-Datei automatisch initiiert. Nachteile jedoch wären, daß dieser Service ständig läuft, fehlgeschlagene Übertragungsversuchen für den Benutzer 'unentdeckt' bleiben, solange diese nicht dem Benutzer optisch zugänglich gemacht werden, was zusätzlich zu bewerkstelligenden Entwicklungsaufwand involviert.
Dennoch kann das, sofern dieser Grad der Automatisierung betreffs Serversynchronisation dringend erwünscht ist, eine durchaus gut zu bewerkstelligender Lösungsansatz sein, wenn der Service alle x Minuten sich die WLAN Verbindung ansieht, und bei bestehender Verbindung dann versucht die erfassten Daten zu übermitteln.

Mir ist nach wie vor jedoch nicht ganz klar, ob die APP auch die Karte & Information (Fähnchen) anzeigt oder lediglich zum Erfassen der Daten dient, sprich lediglich Photos macht und passend zu dem jeweiligen Photo GPS-Koordinaten abspeichert?
Oder ist das zu diesem Zeitpunkt in deinem Konzept noch nicht abschliessend geklärt?

Diese Kartenbibliothek sieht übrigens ganz nett aus, muß ich sagen!

Mfg, Andreas.
 
Hallo asagk :)

Die Trennung ist wahrscheinlich erst einmal sinnvoll.

Da man irgendwo das Projekt auch abgrenzen muss, denke ich werden wir das ganze trivial halten und es per FTP verbindung machen.
Funktioniert das in Android mit einem Art FTPConnectionHandler?

Vielleicht aber auch per PHP..

Das ist wirklich zu überlegen, denkbar wäre für mich beides.

Die App selber macht eig. nur das Speichern und so.
Die Karte wird per php erstellt mit dem leaflets js.

Die App soll dann lediglich per Webview das ganze anzeigen :)

lg
 

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
132
swa00
swa00
S
Antworten
33
Aufrufe
2.674
Sempervivum
S
A
Antworten
10
Aufrufe
1.927
swa00
swa00
Zurück
Oben Unten