2012-04-29 27 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

相關問題