sqlite Datenbank-Aufruf

O

online-dan

Neues Mitglied
0
Hallo zusammen,

ich kenne mich hinsichtlich der App-Architektur noch nicht so gut aus. Aber zur Übersichtlichkeit würde ich gerne alle meine Datenbank-Operationen und -berechnungen in eine Extra-Klasse auslagern. Sobald ein Objekt dieser Klasse erzeugt wird, soll im Konstruktor eine Datenbank geöffnet werden.

Mit folgendem Minimal-Beispiel stürzt meine App leider noch ab und ich erhalte die Meldung

07-15 17:53:49.252: ERROR/AndroidRuntime(753): Caused by: java.lang.NullPointerException

07-15 17:53:49.252: ERROR/AndroidRuntime(753): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:181)
07-15 17:53:49.252: ERROR/AndroidRuntime(753): at de.arbeit.Operationen.<init>(Operationen.java:17)

07-15 17:53:49.252: ERROR/AndroidRuntime(753): at de.arbeit.test.onCreate(test.java:12)

07-15 17:53:49.252: ERROR/AndroidRuntime(753): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
07-15 17:53:49.252: ERROR/AndroidRuntime(753): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
07-15 17:53:49.252: ERROR/AndroidRuntime(753): ... 11 more
Darum meine beiden Fragen:
a) Was haltet ihr von diesem Vorgehen/dieser Architektur? Ist das realisierbar?
b) Warum stürzt das Minimalbeispiel ab?

Meinen Quellcode poste ich Euch mal hier drunter. Für Eure Hilfe bedanke ich mich schon jetzt mal sehr herzlich.

Gruß, Dan

Code:
package de.arbeit;

import android.app.Activity;
import android.os.Bundle;

public class test extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Operationen x = new Operationen();
    }
}
Code:
package de.arbeit;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;

public class Operationen extends Activity {
    /***
     * globale Variablen
     */
    SQLiteDatabase v_datenbank;
    /**
     * Konstruktor
     * */
    public Operationen() 
    {
        //try {
        v_datenbank = this.openOrCreateDatabase("datenbank", MODE_PRIVATE, null);
        //} catch(Exception e){}

    }

}
 
Habs jetzt so gelöst, dass ich von der aufrufenden Klasse (test.java) eine SQLite Datenbank an die Klasse (Operationen.java) beim Erzeugen mitübergebe. Das funktioniert einwandfrei. Komisch - aber gut ;-)

Gruß, Dan
 
Macht Operationen was an der GUI? Activity ist quasi ein Fenster. Und das kriegt von Android nen Context verpasst wenn es per startActivity gestartet wird, darum geht openOrCreateDatabase nicht.
1. Wenn das keine GUI Klasse ist nimm Activity da raus.
2. Wenn es eine GUI Klasse ist, nimm die Datenbankzugriffe da raus!
 
Danke.
Genau, die Klasse Operationen.java habe ich als reine Hilfs- und Berechnungsklasse vorgesehen. Sie soll einfach die Datenbankzugriffe für die GUI-Klassen durchführen und nur die berechneten Werte zurückliefern. Insofern werde ich einfach die Activity rausnehmen.

Muss ich dann trotzdem immer die Datenbank von der aufrufenden Klasse (test.java) mit übergeben? Oder kann ich direkt im Konstruktor von Operationen.java eine DB öffnen?

Gruß, Daniel
 
Du kannst die Datenbank übergeben oder einen Context und öffnest sie selber in der Operationen Klasse. Besser für Kapselung wäre imho die 2. Variante.
Ich würde übrigens auch mal über die Namensgebung nachdenken. Laut Konvention sollen Klassen immer im singular stehen und Auskunft geben über das was sie tut. Besser wäre hier vielleicht irgendwas wie DatenbankHelper oder ähnliches. Auch sollen Klassen groß geschrieben werden. Nur so als Hinweis ;)
 

Ähnliche Themen

R
Antworten
6
Aufrufe
997
swa00
swa00
S
Antworten
33
Aufrufe
2.659
Sempervivum
S
Helmut1A
  • Helmut1A
Antworten
7
Aufrufe
1.126
Helmut1A
Helmut1A
Zurück
Oben Unten