Umgang mit Datenbanken

  • 10 Antworten
  • Letztes Antwortdatum
AppDos

AppDos

Neues Mitglied
1
Hallo,

ich habe jetzt eher mal eine allgemeinere Frage an euch, speziell an die, die sich mit dem Umgang mit Datenbanken auskennen.

Angenommen ich habe eine relationale Datenbank mit Daten(klar soweit ^^)...
Mir scheinen nun zwei Möglichkeiten beim Start der App diese Daten zu laden.
1. Nur die benötigten Daten zu laden und direkt zu verarbeiten oder
2. Alle Daten in entsprechende Objekte zu laden und auf diese zugreifen.

Punkt 1. scheint mir nicht sehr objektorientiert aber Punkt 2 scheint zu aufwendig zu sein.

Und meine zweite Frage:
Nachdem die Daten verarbeitet wurden, werden sie dann direkt in der Datenbank aktualisiert oder erst ab einem bestimmten Punkt, z.B. beenden der App?

Ich bin mir immer etwas unschlüssig welches Verfahren ich benutzen soll, ich hoffe ihr könnt mir ein wenig helfen, vielen Dank,
AppDos
 
Wann Daten in der Datenbank gespeichert/aktualisiert werden, ist ja von die abhängig, wann du dies im Programmcode durchführen lässt.

Generell bin ich für deine zweite Methode (so setze ich das auch um). Dadurch wird die Programmierung, meiner Meinung nach, sauberer und bringt alle Vorteile der Objektorientierung mit sich (Wiederverwendbarkeit, leichter wartbar...).

Und ganz ehrlich? Warum sollte deine 1. Methode weniger aufwändig sein? Sobald du die Datenbankabfragen immer an die Stellen setzt (also wenn die Daten nicht in Objekten vorgehalten werden), wo du auf Daten zugreifst, dann wird dein Code unübersichtlicher, Anpassungen müssen an all den Code-Stellen (statt einfach nur in dem jeweiligen Objekt) durchgeführt werden etc.
 
  • Danke
Reaktionen: AppDos
Ok, vielen dank, dass hilft mir schon mal sehr weiter.

Dann sollte ich Methoden wie dataToObject() und objectToData() haben um die jeweiligen Objekt zu laden/sichern ?

Und wenn nun Daten geändert werden, also eine Variable im Objekt, soll dann jedesmal auch sofort die DB aktualisiert(also direkt objectToData()) werden oder nur an bestimmten Punkten wie beenden der App oder pausieren der App oder einen Button zum speichern der Eingaben ?

Weil mir kommt es etwas aufwendig vor 2 Datensätze(DB/Objekte) permanent synchron zu halten und außerdem hätte man die Daten halt doppelt.
Das war mein Gedanke hinter der Frage, aber wenn du sagst das es trotzdem geht ok, um so besser. ^^
 
Also eigentlich läd man die Daten aus der Datenbank.
Am besten in ein entsprechendes Objekt.
Dann arbeitet man damit und wenn man die Daten speichern will schreibt man das Objekt in die Datenbank.


Ich würde also weder 1 noch 2 nutzen.
Immer dann wenn ich ein Datensatz brauche würde ich den aus der Datenbank laden.

Nehmen wir als Beispiel ein Adressbuch.
Da macht es doch keinerlei Sinn direkt alle Personen aus der Datenbank zu laden.
Bestenfalls macht man eine Abfrage die nur die Namen aus der Datenbank liest und erst wenn man dann z.B. auf einen dieser Einträge klickt läd man den kompletten Datensatz aus der Datenbank in ein "Personen" Objekt.

Wann du speicherst kommst dann auf deine App an, entweder dann wenn du alle Einstellungen gemacht hast (verlassen der Personen Acitivity) oder erst nach dem drücken eines Knopfes.
Nach jeder Änderung würde ich nicht machen (wobei das bei einer lokalen Datenbank auch kein so großes Problem ist).
Sondern nur wenn das komplette Objekt wieder gespeichert werden soll.
Beispiel: Du änderst Telefonnummer und Adresse einer Person.
Welchen Sinn würde es da machen das Objekt direkt in die DB zu schreiben nachdem du mit der TelNummer fertig bist?


Aber um allgemeiner zu bleiben:
Es kommt darauf an

Es gibt keine richtige Lösung, nur eine am besten passende.

Wenn du mir sagst was für Daten du in deiner DB hast kann ich dir sagen wie ich das angehen würde :)
 
  • Danke
Reaktionen: AppDos
Ok, vielen dank ich glaub so macht das Sinn und ich weiß jetzt wie ich das umsetzen werde ^^
Bin gar nicht darauf gekommen beides zu benutzen und nur das entsprechende Objekt zu laden...
Naja manchmal hat man halt ein Brett vorm Kopf ;-)
 
So, ich hab dennoch eine Frage und zwar, wenn ich die Daten nur teilweise in Objekte lade, dann wird das logischerweise nicht immer in der Main Activity geschehen sonder in den Activitys in denen die Daten benötigt werden.
Wie kann ich den den DB-Zugriff für alle Activitys bereitstellen, weil mir das mit den Intents irgendwie nicht richtig vorkommt, falls doch berichtigt mich und sagt mir wie es am besten geht, vielen dank,

AppDos ;-)
 
Was meinst du mit DB-Zugriff in allen Activities?
Im Zweifel in jeder Activity so wie in der Main Activity.

Oder du baust dir eine DatenbankZugriffs Klasse.

Oder für jede Klasse die du aus der Datenabnk holen willst ein DAO (Data Access Object)

So genau kommt's halt auch wieder darauf an was du vor hast.

Bei dem Beispiel oben könnte man auch z.B. eine Adressbuch Klasse bauen die eine .load() und .save() Methode hat und sich um den Datenbankzugriff kümmert.
 
Ich hatte jetzt vor ne DBHelper Klasse zu machen die halt die Verwaltung der DB übernimmt, meine Frage ist nur wie kann ich von jeder Activity Klasse auf den DBHelper zugreifen ohne ihn immer über Intents weiter zu geben ?
Kann gut sein, dass das grade eine Grundlagenfrage ist aber ich fange grade erst mit Android an ;)
 
Naja du kannst dir eine getInstance Methode basteln.

Sieh dir z.B. das mal an:
https://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Code:
class DBHelper {

     //instanz variable
     private DBHelper instance;

     //privater Constructor damit man nicht direkt ein Objekt der Klasse erstellen kann
     private DBHelper() {}


     public static DbHelper getInstance() {
     if (instance != null) {
         return instance;
     }
     return new DBHelper();
     }
}
So sieht das grob aus, dann kannst du aus jeder Activity mit
DBhelper dbHelper = DBHelper.getInstance();

auf das gleiche Objekt zugreifen, dass dann die Datenbankverbindung verwaltet.
 
  • Danke
Reaktionen: AppDos
Ah, vielen dank, an sowas habe ich gedacht ^^

Code:
public synchronized static DatabaseHelper getInstance() {
		if(instance == null) {
			instance = new DatabaseHelper();
		}
		return instance;
	}

müsste so sein oder ? damit instance nicht immer null ist
 
Zuletzt bearbeitet:
Oh Gott.. ja sorum is besser.
Das kommt davon wenn man nach 8 stunden programmieren auf der arbeit noch "eben schnell" ein Foreneintrag schreibt :D
 
Zurück
Oben Unten