tüm zaman boyunca açık tutardım ve onStop
veya gibi bazı yaşam döngüsü yöntemlerinde kapatırdım onDestroy
. bu şekilde, kullanmadan önce her seferinde tek bir nesneyi arayarak isDbLockedByCurrentThread
veya veritabanının zaten kullanımda olup olmadığını kolayca kontrol edebilirsiniz . bu, veri tabanında birden fazla değişiklik yapılmasını önleyecek ve uygulamanızı olası bir çökmeden kurtaracaktır.isDbLockedByOtherThreads
SQLiteDatabase
Dolayısıyla, tekliğinizde, tek SQLiteOpenHelper
nesnenizi elde etmek için bunun gibi bir yönteminiz olabilir :
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;
}
bu nedenle, açık yardımcı nesnenizi her kullanmak istediğinizde, bu alıcı yöntemini çağırın (iş parçacığına sahip olduğundan emin olun)
tekliğinizde başka bir yöntem olabilir (yukarıdaki alıcıyı aramadan önce HER ZAMAN denir):
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
}
}
Veritabanını tekli olarak da kapatmak isteyebilirsiniz:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
Uygulamanızın kullanıcıları çok hızlı bir şekilde birçok veritabanı etkileşimi oluşturma yeteneğine sahipse, yukarıda gösterdiğim gibi bir şey kullanmalısınız. ancak minimum veritabanı etkileşimi varsa, bunun için endişelenmem ve her seferinde veritabanını oluşturup kapatın.