Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果我使用的是Singleton Helper,在哪里关闭SQLiteOpenHelper_Android - Fatal编程技术网

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
配对。我已经经历了多年的这场战斗,但同样,你不需要关闭数据库连接。摘要和证据: