Android 如果我使用的是Singleton Helper,在哪里关闭SQLiteOpenHelper
我有以下类,允许用户获取Android 如果我使用的是Singleton Helper,在哪里关闭SQLiteOpenHelper,android,Android,我有以下类,允许用户获取SQLiteOpenHelper对象 import android.content.Context; public class DBUtils { private DBUtils(){ } private static DBHelper dbHelper ; public static synchronized DBHelper getDBHelper(Context context){ if(dbHel
SQLiteOpenHelper
对象
import android.content.Context;
public class DBUtils {
private DBUtils(){
}
private static DBHelper dbHelper ;
public static synchronized DBHelper getDBHelper(Context context){
if(dbHelper == null){
dbHelper = new DBHelper(context, ApplicationMetaData.DATABASE_NAME, null, ApplicationMetaData.DATABASE_VERSION);
}
return dbHelper;
}
public static synchronized void closeDBHelper(){
if(dbHelper!=null )
dbHelper.close();
dbHelper = null;
}
@Override
protected Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
throw new CloneNotSupportedException();
}
}
我想知道我应该在哪里关闭这个单例对象,因为它不会被调用,所以我不能使用onTerminate()
方法。我想在用户退出我的应用程序时关闭它?这方面的任何解决方案,因为安卓系统设计中没有此类“应用程序关闭”事件。您必须按照活动处理数据库连接,以便知道活动
何时被破坏,或者您必须以某种方式注意哪个对象使用数据库辅助对象,并且只有在没有其他对象再使用辅助对象时才关闭辅助对象
如果使用单例解决方案,请注意将应用程序
上下文传递给getDBHelper()
方法,而不是活动
上下文,因为这可能会导致内存泄漏 我建议使用AtomicInteger
来跟踪getDBHelper
调用的计数。然后,您可以在每个活动中调用getDBHelper
,并在暂停时关闭onPause
/onestory
(任何适合您的情况)。每次关闭调用都会使计数器递减,如果计数器处于0
,则可以真正关闭助手。例如,从演示此方法的ORMlite中可以看到这一点。不要担心关闭它。只需确保您永远不会创建多个SQLiteOpenHelper。请看这里:
或者,在getDBHelper()的构造函数中,始终调用上下文。getApplicationContext()
-这比始终传递应用程序上下文更安全。此外,使用singleton模式,您通常不会关闭SQLiteOpenHelper,就像在编写ContentProvider时不会关闭它一样。如果我将应用程序上下文传递给getDBHelper(),您的意思是如果没有人使用它,我应该通过调用close来关闭它吗?好主意,在DBHelper中设置引用计数器是什么?每次调用getDBHelper()我将递增该计数器,每次关闭我将其递减1,并检查其零调用关闭是的,引用计数器将完成此工作。如果使用引用计数器,您可能需要将getDBHelper
重命名为openDBHelper
。更清楚的是,每个open
都需要一个close
配对。我已经经历了多年的这场战斗,但同样,你不需要关闭数据库连接。摘要和证据: