1. Gewinne jetzt ein UMiDIGI C Note - alle Informationen findest du hier!!
  1. Tom299, 06.03.2012 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    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

    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

    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

    Warum nicht einfach einen ContentProvider daraus machen? Für sowas sind sie doch da.
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Hilfe bei Fehler in Quellcode benötigt Android App Entwicklung Freitag um 23:01 Uhr
[OFFEN] Service wird bei manchen Geräten nicht gestartet Android App Entwicklung 09.04.2017
[ERLEDIGT] In SQLite DB auf nächsten/vorherigen Datensatz zugreifen Android App Entwicklung 23.03.2017
Bei Erreichbarkeit eines Servers eine APP starten Android App Entwicklung 12.02.2017
Google Play Services Fehler Android App Entwicklung 19.12.2016
MySQL Connection Android App Entwicklung 22.11.2016
Bluetooth Low Energy - Cache?? Android App Entwicklung 05.09.2016
Location abfrage in einem Service Android App Entwicklung 13.07.2016
Du betrachtest das Thema "DB Connection als Service?" im Forum "Android App Entwicklung",