2012-04-29 29 views
3

关闭SQLiteOpenHelper我有下面的类,允许用户得到一个SQLiteOpenHelper对象其中,如果我使用的是singelton一个

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()方法上继电器。我想在用户退出我的应用程序时关闭它?任何解决方案

回答

3

由于在设计中没有此类“应用程序已关闭”事件。您必须根据Activity来处理数据库连接,以便您知道何时您的Activity被破坏,或者您必须注意哪些对象使用数据库帮助程序,并且只有在没有其他对象正在使用帮助程序时才关闭帮助程序。

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

+1

或者,在getDBHelper的构造函数()始终调用'context.getApplicationContext()' - 这是不是依靠总是通过应用程序上下文安全。另外,对于单例模式,您通常不会关闭SQLiteOpenHelper,就像您在编写ContentProvider时不关闭它一样。 – Jens 2012-04-29 10:40:02

+0

当然,我将应用程序上下文传递给getDBHelper(),你的意思是我应该关闭助手,如果没有人通过调用close来使用它?好主意,如何使DBHelper引用计数器是每一个调用getDBHelper()我会增加计数器,每一个关闭我递减一,并检查它的零调用是否关闭 – user4o01 2012-04-29 10:40:40

+0

是的引用计数器将完成这项工作。 – Flo 2012-04-29 10:49:33

0

我建议使用AtomicInteger来跟踪getDBHelper调用的计数。然后,您可以拨打getDBHelper每个Activity并关闭/onDestroy(无论适合您的情况)。每次关闭呼叫会减少计数器,如果计数器在0,则可以确实关闭助手。例如,参见ORMlite的sample code,它演示了这种方法。

6

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

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

+0

这应该是被接受的答案,+1 – Brabbeldas 2015-02-01 14:34:19

+0

我已经有这么多年的战斗了,但同样,你不需要关闭你的db连接。总结和证据:http://kpgalligan.tumblr.com/post/109546839958/single-database-connection – 2015-02-08 23:21:30

相关问题