1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

DB Connection als Service?

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 06.03.2012.

  1. Tom299, 06.03.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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
     
  2. Sentence, 06.03.2012 #2
    Sentence

    Sentence Erfahrener Benutzer

    Beiträge:
    242
    Erhaltene Danke:
    51
    Registriert seit:
    27.01.2011
    Phone:
    S3, S6 Edge
    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: 06.03.2012
  3. Sentence, 07.03.2012 #3
    Sentence

    Sentence Erfahrener Benutzer

    Beiträge:
    242
    Erhaltene Danke:
    51
    Registriert seit:
    27.01.2011
    Phone:
    S3, S6 Edge
    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
     
  4. the_alien, 07.03.2012 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Warum nicht einfach einen ContentProvider daraus machen? Für sowas sind sie doch da.
     

Diese Seite empfehlen