我正在使用安卓系统上的SQLite数据库。我的数据库管理器是一个单例,现在它在初始化时打开一个到数据库的连接。让数据库一直处于打开状态是安全的,这样当有人调用我的类来使用数据库时,它就已经打开了?或者我应该在每次访问之前和之后打开和关闭数据库。让它一直开着有什么害处吗?
谢谢!
发布于 2010-12-30 03:32:35
我会让它一直处于打开状态,并以某种生命周期方法(如onStop
或onDestroy
)将其关闭。这样,您就可以在每次使用数据库之前,通过在单个SQLiteDatabase
对象上调用isDbLockedByCurrentThread
或isDbLockedByOtherThreads
来轻松地检查数据库是否已经在使用中。这将防止对数据库进行多次操作,并将应用程序从潜在的崩溃中拯救出来
因此,在您的单例中,您可能有这样一个方法来获取您的单个SQLiteOpenHelper
对象:
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;
}
所以每当你想要使用你的打开的辅助对象时,调用这个getter方法(确保它是线程的)
单例中的另一个方法可能是(每次尝试调用上面的getter之前都会调用):
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
}
}
您可能还想关闭单例中的数据库:
public void finalize() throws Throwable {
if(null != mySingletonHelperField)
mySingletonHelperField.close();
if(null != db)
db.close();
super.finalize();
}
如果您的应用程序的用户能够非常快速地创建许多数据库交互,那么您应该使用我在上面演示过的东西。但如果只有最少的数据库交互,我就不会担心了,每次都会创建和关闭数据库。
发布于 2018-02-22 08:54:45
从性能的角度来看,最好的方法是在应用程序级别上保留单个SQLiteOpenHelper实例。打开数据库可能很昂贵,而且是阻塞操作,因此不应该在主线程和/或活动生命周期方法中完成。
当不使用数据库时,可以使用setIdleConnectionTimeout()方法(在Android8.1中引入)来释放内存。如果设置了空闲超时,则数据库连接将在一段时间不活动后关闭,即未访问数据库时。当执行新的查询时,连接将对应用程序透明地重新打开。
除此之外,应用程序可以在进入后台或检测到内存压力时调用releaseMemory(),例如在onTrimMemory()中
发布于 2014-12-20 18:36:34
您也可以使用ContentProvider。它会为你做这些事情。
https://stackoverflow.com/questions/4557154
复制相似问题