tôi sẽ giữ nó mở toàn bộ thời gian và đóng nó trong một số phương pháp vòng đời chẳng hạn như onStop
hoặc onDestroy
. theo cách đó, bạn có thể dễ dàng kiểm tra xem cơ sở dữ liệu đã được sử dụng chưa bằng cách gọi isDbLockedByCurrentThread
hoặc isDbLockedByOtherThreads
trênSQLiteDatabase
đối tượng mỗi lần trước khi bạn sử dụng nó. điều này sẽ ngăn chặn nhiều thao tác đối với cơ sở dữ liệu và cứu ứng dụng của bạn khỏi sự cố có thể xảy ra
vì vậy trong singleton của bạn, bạn có thể có một phương thức như thế này để lấy SQLiteOpenHelper
đối tượng duy nhất của bạn :
private SQLiteDatabase db;
private MyDBOpenHelper mySingletonHelperField;
public MyDBOpenHelper getDbHelper() {
db = mySingletonHelperField.getDatabase();//returns the already created database object in my MyDBOpenHelper class(which extends `SQLiteOpenHelper`)
while(db.isDbLockedByCurrentThread() || db.isDbLockedByOtherThreads()) {
//db is locked, keep looping
}
return mySingletonHelperField;
}
vì vậy bất cứ khi nào bạn muốn sử dụng đối tượng trình trợ giúp đang mở của mình, hãy gọi phương thức getter này (đảm bảo rằng nó được phân luồng)
một phương thức khác trong singleton của bạn có thể được (được gọi MỌI LÚC trước khi bạn thử gọi getter ở trên):
public void setDbHelper(MyDBOpenHelper mySingletonHelperField) {
if(null == this.mySingletonHelperField) {
this.mySingletonHelperField = mySingletonHelperField;
this.mySingletonHelperField.setDb(this.mySingletonHelperField.getWritableDatabase());//creates and sets the database object in the MyDBOpenHelper class
}
}
bạn cũng có thể muốn đóng cơ sở dữ liệu trong singleton:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
nếu người dùng ứng dụng của bạn có khả năng tạo nhiều tương tác với cơ sở dữ liệu rất nhanh, bạn nên sử dụng một cái gì đó như tôi đã trình bày ở trên. nhưng nếu có ít tương tác với cơ sở dữ liệu, tôi sẽ không lo lắng về điều đó, và chỉ cần tạo và đóng cơ sở dữ liệu mỗi lần.