2012-08-13 86 views
0

我正在設計一個應用程序,它涉及解析大型XML並保持整個應用程序中的序列化數據可訪問。我打算有一個數據對象來保存數據,每個組件(儘管不是每個組件都可以)訪問數據。如何在整個應用程序中保持數據持久性

我希望這些數據是非持久性的,從而應用程序解析XML並將數據保存在內存中。注意這個數據會很大(XML文件大於2MB)。另外,我希望數據在用戶切換到另一個應用程序時在那裏。

我已經調查可能的解決方案,如:

  • 靜態對象
  • 單身
  • 推廣應用
  • 使用服務
  • 使用SQLite數據庫(我不想要做到這一點)

我不想ge t對Singletons與擴展Application的無盡爭論等,但我也想做單元測試,我聽說Singletons和靜態對象很難測試。

任何人都可以對此有所瞭解嗎?什麼是最優雅的方式來做到這一點?

編輯:數據應該持久還是不?將其持久化意味着理論上可以是XML的一個解析,將其串行化,將數據存儲在數據庫中,並可以使用對象從組件訪問數據。聽上去怎麼樣?

編輯2:我認爲在整個應用程序中保持數據可訪問性的方式是使用將存儲數據的SQLite數據庫。

使用XML文件,我將解析數據並在首次啓動時使用創建的SQLiteOpenHelper子類將其放入數據庫中。當需要數據時,我將使用讀訪問使用子類對數據庫進行查詢。每個組件(Activity/Service/etc)都有它自己的SQLiteOpenHelper實例來查詢數據庫並因此可以訪問數據。這聽起來怎麼樣?

+1

對於相對較小的原始數據,我會考慮SharedPreferences。 – 2012-08-13 08:42:04

+0

這可以適用於小數據,但處理的數據很大 – 2012-08-13 09:08:16

回答

0

我想我將保持整個應用程序可訪問的數據的方式是使用SQLite數據庫來存儲數據。

使用XML文件,我將解析數據並在首次啓動時使用創建的SQLiteOpenHelper子類將其放入數據庫中。當需要數據時,我將使用讀訪問使用子類對數據庫進行查詢。每個組件(Activity/Service/etc)都有自己的SQLiteOpenHelper實例來查詢數據庫。

1
+0

謝謝,我想過通過活動傳遞數據,但這可能會變得混亂。我也看了一下Android Framework的常見問題,但是我發現Singleton和靜態數據並不好。我認爲讓數據成爲中心是有意義的。 – 2012-08-13 09:11:24

0

把所有的您的問題考慮在內,我會用Shared Preferences達到你想要的東西。下面是我的應用程序的示例代碼:

修改爲簡單起見:

private static final String PREF_NAME = "MyPrefs"; //Any value would do 
private static final String PREFS_LOGIN_USER= "user"; //Any value would do 
private static final String PREFS_LOGIN_PASSWORD= "password"; //Any value would do 

public void onCreate(Bundle bundle){ 
    super.onCreate(savedInstanceState); 
    .... 

    //Create a preference file 
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); 

    //Put values 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString(PREFS_LOGIN_USER, "admin"); 
    editor.putString(PREFS_LOGIN_PASSWORD, "[email protected]$$w0rd"); 
    editor.commit(); 

    //Get values 
    String userName = settings.getString(PREFS_LOGIN_USER, null); 
    String password = settings.getString(PREFS_LOGIN_PASSWORD, null); 
} 

這些值將持續存在,即使應用程序已被關閉。順便說一下,如果你想刪除值,你也可以使用editor.remove(PREFS_LOGIN_USER)。也致電editor.commit();堅持改變。

+0

問題是XML文件很大,因此必須爲每個XML創建許多共享首選項。此外,數據是許多數據對象的列表。 – 2012-08-13 09:16:42

+0

將大量數據保存在內存中不是一個好習慣。如果您不希望用戶修改它,您會希望將數據保存在/data/user/com.android.yourpackage /目錄中。這樣,你的應用程序使用最少的內存,數據可以隨時訪問。隨着序列化問題,我已經使用[Xstream for android](http://jars.de/java/android-xml-serialization-with-xstream)將xml序列化爲對象,反之亦然。希望這可以幫助! – PinoyCoder 2012-08-13 09:36:42