2010-07-17 69 views
2

我想使用單例模式來保存我的Android應用程序的數據庫和一些其他數據/方法。如何使用數據庫創建Android單例和自定義數據類?

我意識到有很多原因反對單身人士,但對於這種情況,我想使用它。

我已經分類了UIApplication,並在它內部創建了一個名爲MyAppData的數據類。

MyAppData需要有權訪問SQLite數據庫。

當我創建數據庫時,我需要傳遞一個上下文。我可以傳遞應用程序上下文,但它不會直接與MyAppData相關。

我不知道這個wlll是否會導致我的代碼出現問題。

所以我的想法是讓MyAppdata擴展android.content.ContextWrapper。我不認爲我應該擴展Activity,因爲它實際上不是一個活動,它是一個具有訪問數據庫方法的數據類。

我想知道如果我擴展ContextWrapper會有一些深層的代碼我錯過了會導致大問題(內存泄漏等)。

這可能不是這種理想的方法(和我已經考慮其他的選擇),但我的目標是:

中有一個的UIApplication單例類能夠封裝數據庫,並從任何很容易地檢索活動在我的應用程序。

在此先感謝您的建議/警告/建議。

回答

6

子類android.database.sqlite.SQLiteOpenHelperandroid.app.Application(後者在AndroidManifest.xml中正確聲明)。
現在,

public class MyApplication extends Application { 

    private static SQLiteOpenHelper openHelper; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     openHelper = new DbManager(this); 
     // 
    } 

    public static SQLiteDatabase getDB() { 
     return openHelper.getWritableDatabase(); 
    } 
} 

然後讓助手的DAO類將執行instertions /更新/等。
這就是我在我所有的應用程序中使用的。

+0

我已經採用了類似的方法,但之後閱讀了這一個。 – 2010-07-18 21:38:21

+3

我意識到這是一個古老的答案,但如果你仍然可以回憶;你在哪裏關閉從getDB()返回的SQLiteDatabase?每次使用後?或者當應用程序終止時是否有某種方式關閉它?我知道Application中有一個onTerminate方法,但顯然它不在生產設備上調用。 – toc777 2012-02-15 11:13:51

0

我用這個方法:

創建負責管理一個數據庫中的類,我們稱之爲DBUtil。本課程將延伸android.database.sqlite.SQLiteOpenHelper。您可以將對應用程序上下文的引用傳遞給此類的構造函數。這個類將包含創建數據庫,添加,刪除和檢索項目的方法。

創建另一個類,姑且稱之爲AppCore,創建DBUtil的靜態實例,並在我們的應用程序主Activity的onCreate()方法接受一個ApplicationContext對象

public class AppCore 
{ 
    public static var dbUtil:DBUtil; 

    public static void init(ApplicationContext context) 
    { 
     dbUtil = new DBUtil(context); 
    } 
} 

然後用靜態init()方法,初始化AppCore類。

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    AppCore.init(getApplicationContext()); 
} 

所以,它不是一個真正的單身人士。相反,DBUtil實例保持爲靜態屬性,但在整個應用程序仍然可以訪問,比如這個:

AppCore.dbUtil.createNewRecord(params); 

另外,我發現這個教程是非常有益開始使用此話題時:http://developer.android.com/guide/tutorials/notepad/index.html

+0

感謝您的提示和示例代碼,但請問這種方法對我所考慮的方法是否有利有弊?它似乎消除了單身人士,但正如我前面提到的,如果可能的話,我想堅持下去(除非我錯過了一件非常重要的事情,這會改變我的想法)。 – 2010-07-17 21:20:42

+0

這只是我的首選方法。我已經在多個項目中使用過它,並且效果很好。我建議擴展SQLiteOpenHelper,因爲它有一些方便的鉤子。 http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html – JeremyFromEarth 2010-07-17 21:47:16

+0

oooh哇!謝謝你傑里米! – Jorgesys 2010-07-17 22:18:18

相關問題