2013-09-03 14 views
6

mam początkujących pytanie dotyczące baz danych SQLite w Androidzie:Czy muszę zadzwonić getWritableDatabase() za każdym razem manipulowanie danymi

Czy naprawdę trzeba pobrać z możliwością zapisu do bazy danych za każdym razem mogę manipulować danymi?

Więc mogę napisać DAO takiego:

class Dao { 

     private final SQLiteDatabase database; 

     public Dao(SQLiteOpenHelper databaseHelper){ 

      database = databaseHelper.getWritableDatabase(); 
    } 

    public void insert(...){ 

     ContentValues cv = new ContentValues(4); 
     database.insertOrThrow(TABLE, null, cv); 
     ... 
    } 


    public void update(...){ 
     ContentValues cv = new ContentValues(4); 
     database.update(....); 
    } 
} 

czy muszę napisać DAO takiego:

class Dao { 

     private final SQLiteOpenHelper databaseHelper; 

     public Dao(SQLiteOpenHelper databaseHelper){ 

      this.databaseHelper = databaseHelper 
    } 

    public void insert(...){ 

     SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
     ContentValues cv = new ContentValues(4); 
     database.insertOrThrow(TABLE, null, cv); 
     ... 
    } 


    public void update(...){ 
     SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
     ContentValues cv = new ContentValues(4); 
     database.update(....); 
    } 
} 

Jeżeli drugie podejście jest poprawne: mogę również trzeba zamknąć bazę danych po każdej operacji:

public void update(...){ 
    SQLiteDatabase database = databaseHelper.getWritableDatabase(); 
    ContentValues cv = new ContentValues(4); 
    database.update(....); 
    database.close(); 
} 

Podejrzewam, że to samo dla databaseHelper.getReadableDatabase() w prawo?

Odpowiedz

9

Powinieneś zamknąć każdy kursor, który otworzysz. Ale instancja bazy danych nie musi być zamykana po każdym użyciu.

Zazwyczaj pobieram zapisywalną bazę danych w onCreate() i przechowuję wynikową SQLiteDatabase jako zmienną składową dla każdego działania i nigdy nie zamykaj jawnie tej instancji. (Ale znowu zamykam każdy kursor, gdy tylko skończę przetwarzać wyniki.)

Aby uzyskać nieco więcej dyskusji na ten temat, zobacz stronę Managing SQLite Connections in Android.

+1

Nie chcę tego robić w każdym działaniu. Więc podklasuję aplikację i wprowadzę tam coś w rodzaju pojedynczego singla, aby upewnić się, że Dao (bardziej konkretny SQLiteOpenHelper) zostanie zainicjowany tylko raz – sockeqwe

+0

@sockeqwe: Możesz go umieścić w swojej aplikacji jako statyczny, ale to ogólnie uważa się za złą praktykę . Utrudni to również działania związane z testowaniem. Ale jeśli nie dbasz o dobre praktyki lub formalne testowanie kodu, to tak, to może zadziałać. Upewnij się tylko, że żaden z twoich kodów nigdy nie zamyka połączenia; w przeciwnym razie nie będzie oczywiste, dlaczego niektóre działania nie mogą sporadycznie nawiązać połączenia. (Co jest jednym z powodów, dla których jest to zła praktyka.) –

Powiązane problemy