Image Download aufs Smartphone um auch offline diese anzuzeigen

  • Hallo zusammen,


    Ich lade mir aktuell Bilder mit Hilfe der Koush-Ion-Lib von einem Webserver herunter und lade diese direkt in eine ImageView einer ListView-


    Meine Fragen sind eher allgemein:


    - Was ist den der beste Weg, die heruntergeladenen Bilder auf dem Smartphone zuspeichert, damit Ich diese auch ohne Internetverbindung anzeigen kann? Welche Möglichkeiten gibt es überhaupt?
    - Ist es besser Bilder in einer Datenbank zu speichern (MySQL oder SOLite oder sogar beides?) oder auf einem Webserver? Was sind die Vor- was die Nachteile?


    Hoffe mir gibt jemand interessante Anregungen, Antworten oder Tipps.


    Vielen Dank.

  • 1) Eigentlich speicherst Du die Daten auf dem Flash Speicher des Telefons. (Ganz eventuell, sofern unterstützt, auf der SD Karte). Andere Möglichkeiten hast Du da nicht. (Heruntergeladene Bilder sind KEINE Shared Preferences, lass Dir nix erzählen!)


    2) Ich verstehe die Frage nicht ganz. Wenn Du die Bilder offline nutzen willst, hilft Dir ein Webserver ja gar nix.
    Wie dem auch sei, Bilder sollten nicht in einer Datenbank gespeichert werden. Vor Allem bei SQLite Datenbanken blockierst Du Dir durch die langen Zugriffszeiten die komplette Datenbank (bei MySQL nur die komplette Tabelle) und die Datenbank wird elendig groß.
    Wenn Du zu den Bildern noch weitere Informationen speichern möchtest (wie oft angesehen, Kategorie oder was weiß ich), dann packst Du diese Informationen in eine Datenbank und speicherst nur den Pfad zum Bild ab.

    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 die Antwort. Ja, Ich möchte noch weitere Daten speichern.


    Hätte gerne eine DB (MySQL) auf einem Webserver mit Bildern bzw. mit den Links zu den Bildern vom Webserver, und anderen Texten.
    Dann soll es möglich sein, via App diese Daten - aus der Webserver-DB - auf dem Smartphone darzustellen. Falls nun aber die Internetverbindung abbricht, sollen trotzdem noch die Daten und Bilder in der App angezeigt werden. Auch nach erneuten starten der App, soll die App die Daten vom Smartphone -aus der SQLite-DB - beziehen falls keine Internetverbindung besteht.


    Hoffe Ich habe es einigermaßen verständlich beschrieben. Falls nicht, bitte fragen.


    Wie wäre denn das beste Vorgehen um dies zu realisieren? Eine SQLite auf dem Smartphone welche sich mit der MySQL auf dem Webserver synchronisiert falls eine Internetverbindung besteht?
    Was wäre denn ein gute Ansatz? Gibt es hierzu gute Beispiele?

  • Synchronisation ist generell eine eher schwierige Sache.
    Einfacher wäre es vermutlich, wenn die Datenbank auf dem Gerät immer die Inhalte der Webdatenbank annimmt.
    (Synchronisation bedeutet, dass beide Datenbanken ihre Daten miteinander abgleichen…)


    Bei derartigen Konstrukten hast Du immer das Problem, dass es einen Zeitpunkt ohne Daten geben kann.
    Beispielsweise nachdem Du die alte Datenbank weggeworfen hast, die neue Datenbank aber noch nicht wieder zur Verfügung steht. Oder wenn der Nutzer die App aufs Gerät geladen hat und vor dem ersten Start die Internetverbindung deaktiviert hat.


    Im Prinzip solltest Du über einen ContentProvider im Hintergrund die Datenbank (neu) befüllen, alte Elemente als 'veraltet' markieren und dazugehörige Dateien vom Dateisystem löschen und wenn alles geklappt hat die als 'veraltet' markierten Elemente aus der lokalen Datenbank löschen.


    Schwierig ist hierbei lediglich die Kommunikation zwischen App und Web. Es ist im Prinzip eine schlechte Idee, einmal die komplette Datenbank herunterzuladen und umzuschichten. Sinnvoller wäre es wohl, über ein PHP Script die relevanten Datenbankinhalte als JSON zu übergeben, die Datenbank zu befüllen und während des Befüllens zu prüfen, ob die gewünschte Datei schon auf dem Gerät existiert – im Bedarfsfall dann löschen.


    Auf jeden Fall solltest Du irgend einen Indikator mitgeben, über den ermittelt werden kann, ob die Datenbank überhaupt neue Inhalte hat.

    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 die ausführliche Antwort.
    Werde mich mal zu ContentProvider einlesen.


    "Schwierig ist hierbei lediglich die Kommunikation zwischen App und Web. Es ist im Prinzip eine schlechte Idee, einmal die komplette Datenbank herunterzuladen und umzuschichten. Sinnvoller wäre es wohl, über ein PHP Script die relevanten Datenbankinhalte als JSON zu übergeben, die Datenbank zu befüllen und während des Befüllens zu prüfen, ob die gewünschte Datei schon auf dem Gerät existiert – im Bedarfsfall dann löschen."


    Wäre die Kommunikation dann mittels httppost und httpget sinnvoll, oder gibt es einen eleganteren Weg?


    Ist es eine gute Lösung username und passwort in via sharedPreference auf dem Smartphone abzulegen, sollte dies dort verschlüsselt sein? Oder sollte man auch diese Daten besser in einer DB bzw. via ContentProvider ablegen?

  • Theoretisch kannst Du anfangen einen (S)FTP Server oder einen SSH Client zu implementieren.
    Vielleicht kannst Du auch das XMPP Protokoll umbiegen.


    HTTPPost ist schon das Sinnvollste.


    Es ist eine doofe Idee, das Passwort im Klartext verschlüsselt irgendwo abzulegen. Einfach weil im Zweifelsfall immer noch der Anwender seine Daten selbst auslesen kann.
    Ein wenig klüger ist es, den auf Serverseite generierten Hash abzuspeichern.
    Noch besser ist es natürlich, die Verwaltung des Ganzen dem System zu überlassen. Ich weiß nur nicht, ob unter Android irgendwas dafür vorgesehen ist.
    Unter iOS hat man jedenfalls die Keychain. Die für java.security.keychain scheint allerdings zur Zertifikate und Ähnliches zu bunkern, keine normalen Kennwörter.
    Eventuell findest Du ja was zu dem Thema.


    Ansonsten: rausfinden wie Benutzername und Passwort für das Login verschlüsselt werden, eingegebene Werte genau so verschlüsseln und in den SharedPreferences sichern.

    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!«

  • Ein gutes Beispiel für Content Provider:
    http://www.vogella.com/tutorials/AndroidSQLite/article.html


    Alles Andere sind 'advanced topics'. Es dürfte schwierig werden, dazu passende Tutorials zu finden.


    Kommt man selbst ziemlich zügig drauf, wenn man die Grundlagen beherrscht.
    Wenn nicht, wird man auch die Tutorials nicht verstehen.

    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!«

  • Dankeschön, das werde Ich durcharbeiten.
    Wie kann Ich denn Methoden oderInterfaces implementieren die als deprecated gekennzeichnet sind?
    Beispielsweise der Tablistener ist deprecated für API 21. Wie kann ICh dies umgehen? Und gibt es alternativen?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!