2012-02-03 7 views
6
SQLiteOpenHelper dbOpenHelper = new (ctx, nameofdb); 
SQLiteDatabase db = dbOpener.getWritableDatabase(); 

Czy muszę zadzwonić .close() na obu z nich, lub tylko jeden z nich jest na tyle? Jeśli tak, to który?powinienem zadzwonić .close() po obu SQLiteDatabase i SQLiteOpenHelper

SQLiteDatabase 
SQLiteOpenHelper 

Problem mam jest to, że nie widzę jednego konkretnego wiersza w widoku DDMS w Eclipse, ale kiedy używać kursora, aby uzyskać to, to pokazuje, że mam tego wpisu. Zastanawiam się, czy może to być spowodowane niepoprawnym zamknięciem bazy danych? Każdy, kto może pomóc, będzie świetny. Dzięki!

Odpowiedz

5

Jeśli spojrzeć na docs dla SQLiteOpenHelper.close() ...

publicznych zsynchronizowane void Close()

zamknąć wszystkie otwarte obiektu bazy danych.

Nie zamyka się SQLiteOpenHelper, zamyka bazę danych.

Co więcej, jeśli otrzymasz prawidłowy kod, możesz uniknąć bezpośredniego kontaktu z obiektem bazy danych.

Na przykład, jeśli masz zapytanie regularnie używane, aby uzyskać kursor dla adaptera do zapełnienia widoku, utwórz metodę w klasie SQLiteOpenHelper i umieść w niej zapytanie.

Innymi słowy, nie należy odwoływać się do rzeczywistej bazy danych w głównym kodzie, wystarczy uzyskać SQLiteOpenHelper, aby zrobić wszystko za Ciebie.

+1

Co jest w [zasadzie jednej odpowiedzialności] (http://en.wikipedia.org/wiki/Single_responsibility_principle)? Myślałem, że klasa 'SQLiteOpenHelper' używa tylko [aby pomóc], aby otworzyć (aby utworzyć \ zaktualizować) bazę danych. –

+0

@LeonidSemyonov: Można argumentować, że rozszerzenie każdej klasy i dodanie funkcjonalności (nowe metody lub implementowanie interfejsów) i tak dodaje dodatkowe obowiązki ... ale jest to podstawowa zasada OOD/OOP. W Androidzie często zdarza się tworzyć ogólną klasę pomocniczą DB, która sama utrzymuje 'SQLiteOpenHelper'. Chodzi mi o to, że w niektórych przypadkach 'SQLiteOpenHelper' może być rozszerzony, aby zapewnić * ALL * z DB 'pomocnika' metod zamiast oddzielnego DB 'pomocnika' POJO. – Squonk

+0

@Squonk robi 'close any open database object' implikuje, że zamknie wszystkie instancje SqliteDatabase w aplikacji (zakładając, że jest wiele otwartych) lub czy zamyka tylko te, które są związane z bieżącym obiektem SqliteOpenHelper? – aandis

Powiązane problemy