2014-04-27 30 views
2

我有我如何處理我的數據庫在我的應用程序有點顧慮的使用,這裏基本上是我做的:SQLiteOpenHelper變量初始化/整個應用程序

我有一個自定義類擴展SQLiteOpenHelper處理所有的交易與DB。

在我的應用程序中,我有一個單獨的Activity和幾個Fragments在創建,刪除,隱藏或顯示過程中顯示。

在每Fragment,我需要修改或從數據庫中存取數據,我宣佈一個靜態變量:

private static DatabaseHandler mDB; 

我初始化它的onCreate()方法是這樣的:

mDB = DatabaseHandler.getInstance(getActivity()); 

所有這些工作,我關心的是變量本身,在我所有的自定義片段類中聲明它是一個靜態變量是一個好主意嗎?

我也使用相同的方式包含使用mParams = Parameters.getInstance(getActivity());應用程序的主要參數的類,我是否也應該聲明它爲靜態?

我想避免內存泄漏和NPE,但我不知道什麼是正確的方式來處理。

僅供參考,我DatabaseHandler類的開頭:

public class DatabaseHandler extends SQLiteOpenHelper { 

private static DatabaseHandler sInstance = null; 

(...) 

private Resources mResources; 

public static DatabaseHandler getInstance(Context context) { 

    if (sInstance == null) { 
     sInstance = new DatabaseHandler(context); 
    } 
    return sInstance; 
} 

private DatabaseHandler(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    mResources = context.getResources(); 
} 

(...) 

謝謝

回答

2

我通常在我的Application類和整個應用程序的訪問創建SQLiteDatabase靜態實例。

所以,我有一個自定義類,它在應用程序創建時返回SQLiteDatabase實例。

這是我的應用程序類

public class MainApplication extends Application { 

    private static SQLiteDatabase mSQLiteDatabase = null; 
    @Override 
    public void onCreate(){ 
     super.onCreate(); 
     SQLiteAsyncTask sqLiteAsyncTask = new SQLiteAsyncTask(getApplicationContext()); 
     mSQLiteDatabase = (SQLiteDatabase) sqLiteAsyncTask.loadInBackground(); 
    } 

     // method to get the sqlite db instance 
     public SQLiteDatabase getSQLiteInstance(){ 
     return mSQLiteDatabase; 
     } 
} 

現在你可以從活動或片段的SQLiteDatabase例如,通過

  MainApplication.getSQLiteInstance() 
+0

我讀了一些答覆說,這是更好地避免延長'應用'類,並且Android文檔還指出:'通常不需要子類Application。在大多數情況下,靜態單例可以以更模塊化的方式提供相同的功能。(來源:[link](http://developer.android.com/reference/android/app/Application.html)) –

+0

我不' t認爲擴展'Application'會產生任何問題,因爲例如在應用程序啓動時加載數據庫在Application類中執行而不是在Activity中執行。 – Libin