Tôi cũng có nhiều Hoạt động và mỗi Hoạt động sẽ mở kết nối cơ sở dữ liệu của riêng mình. Tôi giữ cho hoạt động chính còn sống trong khi tôi bắt đầu các hoạt động khác, và tôi gọi kết thúc() về các hoạt động của trẻ khi tôi không còn cần chúng nữa.
Điều tôi thấy là một đứa trẻ Hoạt động có thể mở thành công dữ liệu kết nối và truy vấn trong khi Actitity chính vẫn đang giữ trên DBAdapter của nó. Khi Activity con kết thúc, Activity chính sẽ yêu cầu bất kỳ con trỏ nào đang mở. Điều này dường như xảy ra tự động.
Tuy nhiên, sau khi nhấp vào xung quanh trên giao diện người dùng trong một thời gian, gây ra ứng dụng của tôi để bắt đầu và kết thúc hoạt động, tôi cuối cùng sẽ có được ngoại lệ:
ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
/data/data/yourpackage/databases/yourdatabase
SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
(SQLiteDatabase.java:1694)
Trường hợp ngoại lệ không phải là từ Hoạt động đó là hiện tại ở tiền cảnh, nhưng từ một trong đó đã được hoàn thành một thời gian trước đây. Vì vậy, điều xảy ra là bộ thu gom rác đang dọn dẹp và tìm kết nối cơ sở dữ liệu mở. Điều này không ảnh hưởng đến ứng dụng - nó tiếp tục hoạt động tốt và tất cả các truy vấn từ dữ liệu trả về Hoạt động nền trước.
Giải pháp đơn giản là đóng kết nối trong Hoạt động con. Sự kiện onDestroy() là nơi thích hợp để làm điều đó:
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
Vì tôi đặt điều này trong tất cả các hoạt động của con tôi, tôi không còn bị ngoại lệ.
Bạn có thể đóng db sau khi bạn đã viết cho nó .. – svens
Tôi cũng nghĩ về điều đó, nhưng một hoạt động là ListActivity được điền bằng bộ điều hợp con trỏ. Tôi nghĩ rằng đóng cơ sở dữ liệu sẽ làm cho requery của bộ điều hợp thất bại. –
@John: nếu bạn sử dụng cơ sở dữ liệu singleton, bạn mở và đóng nó ở đâu? – Emerald214