3

我有以下类允许用户获取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();
    }

}

我想知道这个单例对象应该在哪里,因为它不会被调用,所以close我无法在该方法上进行中继。onTerminate()我想在用户退出我的应用程序时关闭它?任何解决方案

4

3 回答 3

7

不要担心关闭它。只要确保你永远不会创建多个 SQLiteOpenHelper。看这里:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

于 2012-12-20T23:03:42.587 回答
3

由于 Android 设计中没有这样的“应用程序已关闭”事件。你要么必须处理你的数据库连接,Activity这样你才能知道你什么时候Activity被销毁,或者你必须以某种方式注意哪个对象使用数据库帮助程序,并且只有在没有其他对象不再使用帮助程序时才关闭帮助程序。

如果您继续使用单例解决方案,请注意将上下文而不是上下文传递Application给方法,因为这可能会导致内存泄漏。getDBHelper()Activity

于 2012-04-29T10:25:23.657 回答
0

我建议使用 anAtomicInteger来跟踪getDBHelper调用次数。然后你可以调用getDBHelper每个Activity并在onPause/处关闭onDestroy(无论你的情况如何)。每次关闭呼叫都会减少计数器,如果计数器在您身边,0您可以真正关闭您的助手。例如,请参阅ORMlite 中演示此方法的示例代码

于 2012-04-29T10:39:57.020 回答