DB Connection als Service?

T

Tom299

Stammgast
122
Hallo,

ich habe bis jetzt noch keinen Service programmiert, aber ich würde gerne mal wissen, ob es Sinn macht, den Zugriff auf die DB als Service zu implementieren.

Hintergund: Ich habe zur Zeit ca. 20 Activities, die alle auf die gleiche DB zugreifen. Ich habe den DB-Helper statisch gemacht, damit ich nicht überall den DBHelper erzeugen muß, um dann die DB zu öffnen bevor ich Abfragen starten kann. Das hat auch lange Zeit ohne Probleme funktioniert.

Aber auf meinem HTC Sensation herrscht oft Speichermangel, und so kommt es hin und wieder vor, daß Android meine statische Klasse entsorgt und somit ist meine DB-Verbindung hinüber. Ähnliches passiert, wenn ich die CAM über das Intent aufrufe, auch da werden hin und wieder Activities und meine statische Klasse entsorgt.

Als Workaround hab ich nun in jeder Activity den DBHelper erzeugt, öffne die DB vor jedem DB-Zugriff und danach schließe ich die DB wieder. Daduch hab ich keine Probleme mehr wenn die Activity zerstört wird oder in onPause geht. Aber ich glaube nicht, daß das wirklich performant ist. Den Cursor schließt man nach jeder Abfrage, das ist klar, aber die DB doch nicht, oder?

Jedenfalls dachte ich mir, daß ich einen Service habe, der mir die DB-Connection zur Verfügung stellt. Startet der Service, wird die DB geöffnet und bleibt solange offen, bis meine Anwendung beendet wird. Beim Beenden sollte die DB geschlossen werden. D.h. ich müßte mich in meinen Activities nur noch um das Schließen des Cursors kümmern, die DB-Connection sollte immer verfügbar sein.

Ist das ein guter Ansatz? Oder ist es legitim, in jeder Activity den DBHelper zu erzeugen und DB open und close bei allen Aufrufen zu machen?


Gruß Tom
 
Moin,
möglich wäre das sicher, aber ich denke es ist einfacher die DB geschichte ins Application Object zu packen.
Dort im onCreate die DB öffnen und im onTerminate wieder schließen.

Ist nur ein Gedanke, hab ich noch nicht probiert.
MfG

//EDIT
Hier ist ein kurzes Beispiel
http://www.ragtag.info/2011/feb/1/database-pitfalls/

Hab leider grad keine Zeit mehr das zu testen, aber die Idee gefällt mir :D
 
Zuletzt bearbeitet:
Moin,
ich hab das mal kurz getestet.
So sieht die Singelton Klasse aus.
Code:
public class DBTest extends Application {
    private static MyDBHelper sqliteOpenHelper;
    private static SQLiteDatabase sqliteDatabase;
 
    @Override
    public void onCreate() {
        super.onCreate();
        sqliteOpenHelper = new MyDBHelper(this);
    }

    @Override
    public void onTerminate() {
        if (sqliteOpenHelper != null) {
        	sqliteOpenHelper.close();
        }
        if (sqliteDatabase != null) {
        	sqliteDatabase.close();
        }
        super.onTerminate();
    }
    
    public SQLiteDatabase getReadableDatabase() {
        return sqliteOpenHelper.getReadableDatabase();
    }
    public SQLiteDatabase getWritableDatabase() {
        return sqliteOpenHelper.getWritableDatabase();
    }
}
In einer Activity greif ich dann so darauf zu:
Code:
DBTest db = (DBTest)getApplication();

SQLiteDatabase con = db.getReadableDatabase();

Cursor result = con.rawQuery("SELECT something FROM somethingelse", null);
Das funktioniert gut, auch über mehrere Activities hinweg.
Ist das ein guter weg? Was sollte man noch beachten?

Mfg
 
Warum nicht einfach einen ContentProvider daraus machen? Für sowas sind sie doch da.
 

Ähnliche Themen

Manny87
  • Manny87
Antworten
11
Aufrufe
162
swa00
swa00
R
  • raller
Antworten
15
Aufrufe
546
DOT2010
DOT2010
S
Antworten
4
Aufrufe
994
Sempervivum
S
Zurück
Oben Unten