2013-07-24 16 views
13

Tworzę aplikację, która wykonuje wiele interakcji z bazą danych (operacje odczytu i zapisu).Prawidłowo otwórz/zamknij bazę danych za pomocą wzoru projektowego Singleton

Aby uniknąć operacji otwierania/zamykania przy każdym żądaniu, utworzyłem klasę rozszerzającą SQLiteOpenHelper o wzorzec projektu Singleton. W ten sposób, jestem pewien, że tylko jedno wystąpienie SQLiteOpenHelper i tylko jedno połączenie z bazą danych jest wykonywane podczas całego cyklu życia cyklu (i nie tylko).

Przeczytałem również kilka artykułów na temat ContentProvider, ale nie jestem pewien, czy to lepszy sposób.

Tak, to jest główny logika mojej klasy Singleton (onCreate i onUpgrade usunięte):

public final class BaseSQLite extends SQLiteOpenHelper { 

    private static BaseSQLite mInstance = null; 

    private SQLiteDatabase db = null; 

    public static BaseSQLite getInstance(Context context) { 
     if (mInstance == null) { 
      mInstance = new BaseSQLite(context.getApplicationContext(), 
        DBNAME, DBVERSION); 
     } 
     return mInstance; 
    } 

    private BaseSQLite(final Context context, final String name, 
      final int version) { 
     super(context, name, null, version); 
     db = getWritableDatabase(); 
    } 

    @Override 
    public synchronized void close() { 
     if (mInstance != null) 
      db.close(); 
    } 

    public Cursor getAllData() { 
     String buildSQL = "SELECT * FROM myTable"; 

     return db.rawQuery(buildSQL, null); 
    } 

} 

Tak więc, aby uzyskać dostępu do bazy danych, zrobiłem to:

BaseSQLite baseSQLite = BaseSQLite.getInstance(context); 
baseSQLite.getAllData(); 

To działa idealnie na teraz. Ale moje pytanie dotyczy metody close(). Naprawdę nie wiem, kiedy to nazwać. W rzeczywistości moja instancja bazy danych jest taka sama dla każdej aktywacji mojej aplikacji, więc myślę, że nie jest dobrym pomysłem wywoływanie close() w metodzie onPause(), ponieważ instancja będzie potencjalnie (i często się zdarza) odtworzona w metodzie onStart() następnej czynności. Ponadto nie mogę wykryć mojej aplikacji, tj. Gdy żadna aktywność nie jest już widoczna na ekranie.

Czy ktoś może mi pomóc w rozwiązaniu tego problemu? Znalazłem odpowiedź, gdy baza danych jest połączona z aktywnością ONE, ale nie podano żadnej wskazówki dla mojej sprawy.

Odpowiedz

0

Powinieneś zadzwonić do mnie, gdy tylko skończysz pisać w bazie danych. Na przykład, gdy wstawisz dane, będziesz mieć otwarte połączenie z bazą danych, która powinna zostać zamknięta po zakończeniu.

Czytanie jest inne. Podczas tworzenia bazy danych SQLite w telefonie dane są trwałe. Baza danych istnieje i utworzony moduł obsługi zapewnia wygodny sposób dostępu do tych informacji. Odczytywanie bazy danych zwykle odbywa się poprzez pobranie czytelnej instancji bazy danych i użycie wartości Cursor. W takim przypadku zamykasz kursor, gdy skończysz, a nie samą bazę danych.

Masz rację, że nie powinieneś zamykać połączenia z bazą danych podczas różnych metod cyklu życia poszczególnych działań. Zamiast tego, jak zasugerowano powyżej, zamknij połączenie z bazą danych w metodach programu obsługi, które zapisują dane w bazie danych po zakończeniu wykonywania tej transakcji.

+0

Ok, więc muszę usunąć linię 'db = getWritableDatabase()' i dodać w każdej metodzie 'getWritableDatabase()' lub 'getReadableDatabase()'. Następnie, w metodzie pisania, na przykład 'updateEntry (Object)' na przykład, powinienem zrobić coś takiego: 'getWritableDatabase(); db.rawQuery (myRequestString, null); db.close() '? – mithrop

+0

if myRequestString jest instrukcją typu insert - yes. [popatrz na ten przykład] (http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/) Nie sugeruję, że dokładnie kopiujesz, ale widzisz, jak blisko działa transakcja. Sposób, w jaki to robię, to posiadanie metody w klasie obsługi db, która wykonuje każdą funkcję zapisu - np. dodaj wpis do tabeli. Na początku tej metody otrzymuję możliwą do zapisania instancję db i kiedy transakcja jest zakończona zamykam ją na końcu metody. – Rarw

+0

Ok. Wydaje się, że jest to naprawdę dobra opcja.Martwiłem się występami wykonującymi wiele otwartych/zamkniętych połączeń, ale najwyraźniej to naprawdę nie jest problem :) – mithrop

Powiązane problemy