2012-07-12 38 views
5

Tiêu đề này nghe có vẻ hơi điên rồ, nhưng đây là điều làm tôi bối rối. Ứng dụng của tôi sử dụng nhiều hoạt động cơ sở dữ liệu cục bộ. Như đã đề xuất trong tài liệu Android và một số blog, tôi đã mở rộng lớp SQLiteOpenHelper và xác định tất cả các hoạt động DB của tôi ở đó. Khi một số hoạt động DB của tôi thực hiện trong các luồng, việc mở và đóng của db gây ra một số IllegalStateExceptions. Vì vậy, tôi đã hỗ trợ DB của tôi là Singleton và giải quyết những vấn đề đó, đồng thời cũng loại bỏ các hoạt động openclose cho mọi hành động DB. Bây giờ mọi thứ dường như hoạt động tốt mặc dù tôi chưa bao giờ đóng DB.Điều gì sẽ xảy ra nếu tôi không đóng cơ sở dữ liệu trong Android?

  • Sự nhầm lẫn của tôi là cần thiết phải đóng DB?
  • Nếu vậy, địa điểm phù hợp để làm như vậy, là gì trong số onDestroy hoạt động chính hoặc ở một nơi khác?
  • Nếu tôi không đóng DB, các tác dụng phụ là gì?

Trả lời

0

Bạn có thể bắt IllegalStateException nếu bạn sẽ cố gắng mở lại cơ sở dữ liệu tương tự.

Nếu bạn tạo phiên bản DBHelper trong phương thức hoạt động chính onCreate - nó sẽ được viết để đóng db trong onDestroy. Vì vậy, bạn có thể chắc chắn rằng lần sau trong onCreate cơ sở dữ liệu của bạn chưa được mở.

Nếu bạn có tham chiếu đến DBHelper trong dịch vụ, thay vì phải được mở và đóng trong dịch vụ và không hoạt động.

Bạn cũng có thể sử dụng Application lớp mở db, nhưng hơn nó sẽ mở ra mỗi khi bạn ứng dụng bắt đầu (ví dụ như khi bạn nhận được BroadcastReceiver)

0

Lý do tại sao bạn nhận được trường hợp ngoại lệ là bạn đang cố gắng ghi/đọc từ cùng một cơ sở dữ liệu qua các chủ đề khác nhau.

Tôi tin rằng nơi tốt nhất để đóng cơ sở dữ liệu của bạn sẽ được bên trong onDestroy() của bạn MainActivity.

0

Tôi gặp phải vấn đề tương tự. Tôi đã mở cơ sở dữ liệu, thực hiện một số thao tác và tôi quên đóng. Thực tế tôi thấy một số ngoại lệ mà logcat là "Rò rỉ tìm thấy" db được mở và không bao giờ đóng.

Các vấn đề liên quan