Daten mitliefern / aktualisieren - best practise?

  • Antworten:14
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 15

05.01.2015, 21:58:44 via Website

Hallo,

ich arbeite an einer app, die Wörter mit weiteren Informationen anreichern soll. Sie soll später auf einer Datenbank basieren, die die jeweiligen Infos enthält.
Ich hatte es mir so vorgestellt, dass die Datenbank schon mit der App mitgeliefert wird und später aber aktualisierbar sein soll (übers internet).
Die zu aktualisierenden Daten sollen dann von meinem Server geladen werden.

Ist das eine gute idee, oder spricht etwas dagegen (z. B. "Sicherheitsaspekte")?

Viele Grüße

Antworten
  • Forum-Beiträge: 15

06.01.2015, 10:02:08 via Website

Hallo,
also die Datenbank selbst sollte so verschlüsselt sein, dass der Nutzer sie nicht extrahieren und für eigene Projekte nutzen kann. geht das?
Meine Frage zielt auch eher darauf ab, ob Android selbst irgendwelche Hürden setzt, fremde Inhalte runterzuladen...
Viele Grüße!

Antworten
  • Forum-Beiträge: 434

06.01.2015, 10:47:26 via App

Hallo, du müsstest die Datensätze verschlüsseln und da sie zur Verwendung entschlüsselt werden müssten ist es je nach Umfang der DB performancelastig. Und selbst dann kommt man noch mit mehr oder weniger Aufwand an die Datensätze ran.
Das Smartphone ist kein guter Ort für Geheimnisse. Vielleicht weiß noch jemand anderes mehr, aber ich sehe keine allzu große Chance Daten dauerhaft geheim zu halten.

Open Source

Antworten
  • Forum-Beiträge: 15

06.01.2015, 11:17:58 via Website

naja, es muss nicht 100% sicher sein, aber die Daten sollten nicht im Klartext als .csv im App-Verzeichnis liegen...

Antworten
  • Forum-Beiträge: 2.243

06.01.2015, 11:37:05 via Website

Ist ein gangbarer Weg, jedoch würde ich ein paar Sachen beachten.

Wenn Du die Daten verschlüsselt vom Server auslieferst und auf dem Smartphone dechiffrierst, stelle sicher, dass Du auf beiden Seiten den 100% gleichen Algorithmus verwendest, der zusätzlich auf allen von dir angepeilten Geräten vorhanden ist. Nicht jedes Android Gerät unterstützt jeden Chiffre in allen seinen möglichen Ausprägungen (Stichwort Padding etc.).
Gib den Algorithmus auch immer voll qualifiziert mit allen Optionen an, damit das Gerät keinen Interpretationsspielraum hat und womöglich versucht mit seinem (womöglich abweichenden) Default-Padding zu dechiffrieren. Das geht in die Hose.

Speziell wenn es überwiegend Text ist, würde ich auch darauf achten die Daten mit gzip Encoding zu versenden.
Das spart Zeit und Traffic.

— geändert am 06.01.2015, 11:40:39

Antworten
  • Forum-Beiträge: 15

06.01.2015, 20:58:18 via Website

Hallo,

danke schonmal für die Rückmeldungen!

Mir ist noch die Idee gekommen, das ganze evtl. ohne Datenbankzugriff zu machen, um die App weniger aufwändig zu machen (bin selbst einsteiger und vielleicht ist eine Datenbank auch gar nicht nötig).

Ich dachte daran, die Daten als Textdatei zu liefern und beim Start der App zu starten. Die Datei müsste ca. 4000 Einträge haben (z. b. Zeilen oder json?).
Ist das denkbar?

Was denkt Ihr?

Viele Grüße!

Antworten
  • Forum-Beiträge: 2.243

06.01.2015, 21:05:46 via Website

Es "geht" auch so.
Je nachdem was du mit den Daten machst, wird die JSON Datenstruktur aber zum Flaschenhals bei der Performance, weil du keine strukturierten Anfragen machen kannst.
Mit etwas Hintergrundwissen kannst Du dir natürlich auch im Speicher eine effiziente Datenstruktur aufbauen. Musst halt nur gut überlegen was Deine Hauptanwendungsfälle sind.

Antworten
  • Forum-Beiträge: 15

06.01.2015, 21:55:12 via Website

Hallo,

also im Grunde dachte ich an eine Datei mit einem etwa folgenden Aufbau:

Schildkröte | kein Säugetier | Lebt in der Nähe von Gewässern
Tiger | Säugetier | Lebt in der Steppe
Taube | kein Säugetier | Lebt in Städten und sonstwo

usw..

ich möchte evtl. auch mehrere Bezeichnungen ins erste Feld backen, nach denen gesucht werden kann:

z. B.

taube,blautaube,turteltaube,tauben | kein Säugertier | Lebt in Städten und sonstwo

entsprechend würde ich versuchen, ob ein Array im ersten Feld einen String enthält, der eines der Worte enthält...

Alternativ kann ich natürlich vorher die Werte auch auseinandernehmen und einfach für jede suchmöglichkeit eine Zeile anlegen...
Ich frage mich nur (da ich wie gesagt erst mit der Entwicklung anfange) wie da ungefähr die performance wäre... dauert das 5 sekunden oder eher ne halbe sekunde?

viele grüße!

Antworten
  • Forum-Beiträge: 2.243

07.01.2015, 00:22:40 via Website

ob ein Array im ersten Feld einen String enthält, der eines der Worte enthält

OK, für die Übertragung der Daten ist JSON super, jedoch nicht für die Suche.
Im Endeffekt führst Du eine lineare Suche über eine Menge durch, die auf Grund ihres Aufbaus (Taube, Blautaube,...) nicht alphabetisch sortiert werden kann.
D.h. bei jeder Suche prüfst Du jeden Datensatz auf einen Teilstring (was noch ineffizienter ist als Identität zu prüfen).
Das dürfte sogar auf einem schnellen Telefon merkbar Zeit kosten. Ich tippe im einstelligen Sekundenbereich.

Grundsätzlich solltest Du die Datenstruktur aber noch optimieren.
Ein Feld mit einer Liste von Werten zu befüllen ist idR. eine schlechte Idee, es widerspräche zum Beispiel auch den "Normalenformen", die man zur Optimierung von Datenbanken heranzieht.
"kein Säugetier" und "lebt in..." solltest Du evtl. auch durch einen numerischen Code ersetzen, der erst bei der Anzeige in einen Text gewandelt wird. Sonst speicherst Du im worst case 4000 mal denselben Text.

Antworten
  • Forum-Beiträge: 15

07.01.2015, 08:42:59 via Website

Hallo,
ok, das hatte ich mir gedacht... :)

Wenn ich nun jeden Eintrag so aufbaue (in json):

array("taube","Beschreibung",1,0,"blablabla");
array("Blautaube","Beschreibung",1,0,"blablabla");
usw

stellt sich natürlich die Frage, wie ich da die Suche ausführe. Im Grunde müsste ich ja nur schauen, ob ein Array mit dem Indiz "Taube" vorhanden ist. Wenn ja, liefere ich die entsprechendne INfos zurück.

Bloß: Bei Groß- und Kleinschreibung bekomme ich da Probleme, richtig? Wie ist es mit Umlauten?
Ich müsste dann also alle Array immer kleingeschrieben indizieren... können Umlaute enthalten bleiben? dann bei der Suche erstmal den Suchstring "toLowerCase()" und damit suchen.... puh. Aber vielleicht immer noch einfacher als über ne Datenbank?

Wsa denkt Ihr?

Bei den "säugetier" / "nicht säugetier"-Feldern hatte ich schon eine Flag-Lösung eingeplant, habe das hier nur verständnishalber so dargestellt.

Viele Grüße

Antworten
  • Forum-Beiträge: 2.243

07.01.2015, 12:34:48 via Website

Meine Meinung:
Du wirst viel Arbeit in die Optimierung einer Datenstruktur stecken, die andere bei Datenbanken schon längst (und viel intensiver) geleistet haben.
Wenn es Dir nicht grade darum geht dein Wissen um Datenstrukturen zu verbessern und du darum das Rad sprichwörtlich neu erfinden willst, würde ich definitiv eine DB nehmen.

— geändert am 07.01.2015, 12:35:26

Antworten
  • Forum-Beiträge: 15

07.01.2015, 12:51:26 via Website

gut, du hast wahrscheinlich recht.
ich habe öfter mit datenbanken in php/mysql gearbeitet, aber bei android drücke ich mich noch etwas davor, weil ich noch nicht ganz verstehe, wie ich fehlerausgaben, eingaben usw. überhaupt prüfen und handeln kann. gibt es eine art datenbank-manager o.ä.? sonst wird das ein ewiges raten, warum welche einträge nicht so und so angezeigt werden...
tutorials haben mich dazu eher verwirrt...

Antworten
  • Forum-Beiträge: 2.243

07.01.2015, 13:13:36 via Website

Ich habe das ganze auch anhand der Google Developer Guides und einiger Tutorials kennengelernt.
Was besseres fällt mir da auch nicht ein :)

http://developer.android.com/training/basics/data-storage/databases.html

— geändert am 07.01.2015, 13:14:34

Antworten
  • Forum-Beiträge: 1.904

07.01.2015, 15:54:48 via App

Aus Erfahrung kann ich sagen, dass eine SQLite Datenbank auf dem Handy mit 1000 Einträgen bei einer Query mit dem LIKE(also auch Teilstrings) unter eine Millisekunde braucht, um mir die Ergebnisse zu liefern. Die 4000 Einträge machen den Kohl auch nicht fett 😁😂

— geändert am 07.01.2015, 15:55:30

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten

Empfohlene Artikel