2012-07-12 7 views
5

Ten tytuł może zabrzmieć trochę szaleńczo, ale to właśnie sprawia, że ​​jestem zdezorientowany. Moja aplikacja intensywnie korzysta z lokalnych operacji na bazach danych. Zgodnie z sugestiami w dokumentach systemu Android i niektórych blogach rozszerzyłem klasę SQLiteOpenHelper i zdefiniowałem tam wszystkie operacje DB. Ponieważ niektóre operacje DB wykonywane są w wątkach, otwieranie i zamykanie bazy danych powoduje pewną liczbę IllegalStateExceptions. Zrobiłem więc pomocnika DB jako Singleton i rozwiązałem te problemy, pozbywając się operacji open i close dla każdej akcji DB. Teraz wszystko działa dobrze, mimo że nigdy nie zamykam bazy danych.Co się stanie, jeśli nie zamknę bazy danych w systemie Android?

  • Mój błąd polega na tym, że trzeba zamknąć DB?
  • Jeśli tak, jakie jest właściwe miejsce, czy jest to onDestroy głównej działalności lub gdzieś indziej?
  • Jeśli nie zamykam DB, jakie są skutki uboczne?

Odpowiedz

0

Możesz złapać IllegalStateException, jeśli spróbujesz otworzyć ponownie tę samą bazę danych.

Jeśli utworzysz instancję DBHelper w metodzie głównej onCreate - będzie to zapis na zamknięcie db w onDestroy. Tak więc możesz być pewien, że następnym razem w onCreate twoja baza danych nie jest już otwarta.

Jeśli masz referencję do usługi DBHelper w serwisie, to powinna ona być otwarta i zamknięta w działaniu, a nie w działaniu.

Można również użyć Application klasę otwarcia db, ale nie będzie on otwierany za każdym razem, gdy app starty (na przykład, gdy pojawi BroadcastReceiver)

0

Powodem masz wyjątków jest próbujesz zapis/odczyt z tej samej bazy danych przez różne wątki.

wierzę najlepsze miejsce, aby zamknąć bazę danych byłoby wewnątrz onDestroy() swojej główną działalność.

0

Stawiłem czoła temu samemu problemowi. Otworzyłem bazę danych, wykonałem operację i zapomniałem zamknąć. Po prostu widziałem kilka wyjątków i logcat, który jest "Wyciek znaleziony" db jest otwarty i nigdy nie zamknięty.

Powiązane problemy