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.
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
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
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