在Android中一共提供了5種資料存放區方式,分別為:
(1)Files:通過FileInputStream和FileOutputStream對檔案進行操作。具體使用方法可以參閱博文《Android學習筆記34:使用檔案儲存體資料》。
(2)Shared Preferences:常用來儲存索引值對形式的資料,對系統配置資訊進行儲存。
(3)Content Providers:資料共用,用於應用程式之間資料的訪問。
(4)SQLite:Android內建的輕量級關係型資料庫,支援SQL語言,用來儲存大量的資料,並且能夠對資料進行使用、更新、維護等操作。
(5)Network:通過網路來儲存和擷取資料。
本篇博文主要介紹第二種方式,通過Shared Preferences儲存資料。
1.使用Shared Preferences儲存資料和讀取資料
Shared Preferences是Android系統提供的一個輕量級的儲存類,主要用於儲存一些配置資訊,比如視窗狀態(大小、亮度等)。
Shared Preferences使用索引值對的形式來儲存資料,可以對常用資料類型boolean、float、int、long以及String進行儲存。儲存的資料以xml檔案的形式儲存在/data/data/<包名>/shared_prefs目錄下。
1.1使用Shared Preferences儲存資料
使用Shared Preferences儲存資料可以通過以下4個步驟來實現:(1)使用Context類提供的getSharedPreferences()方法,擷取SharedPreferences對象。getSharedPreferences()方法的原型如下:
public abstract SharedPreferences getSharedPreferences(String name, int mode);
其中,參數name表示儲存資料的檔案名稱。有一點需要注意的是,此處只是定義了該檔案名稱,該檔案實際上並沒有被建立,該檔案只有當建立了SharedPreferences.Edit對象並使用該對象的commit()方法提交資料時,才會被建立。
參數mode用於指定檔案的操作模式,其可選值有Context.MODE_APPEND(內容追加模式)、Context.MODE_PRIVATE(預設操作模式)、Context.MODE_WORLD_READABLE(可讀模式)、Context.MODE_WORLD_WRITEABLE(可寫入模式)四種,與《Android學習筆記34:使用檔案儲存體資料》中提到的openFileOutput()方法的第二個參數是一樣的。
(2)使用SharedPreferences對象的edit()方法建立SharedPreferences.Edit對象。使用Shared Preferences方式儲存資料時需要藉助SharedPreferences.Edit類提供的方法來添加資料。SharedPreferences.Edit類提供的方法1所示。
圖1 SharedPreferences.Edit類提供的方法
可以看出,SharedPreferences.Edit類提供了以索引值對的形式儲存boolean、float、int、long以及String資料類型的資料的方法。
(3)使用SharedPreferences.EditObject Storage Service資料。
(4)使用commit()方法提交資料。
通過以上的4個步驟實現資料存放區的一個簡單樣本如下:
1 /* 2 * Function : 儲存資料到SharedPreferences對象中 3 * Param : fileName儲存資料的檔案名稱;userName、userPswd儲存的資料 4 * Author : 部落格園-依舊淡然 5 */ 6 public boolean saveDataToSharedPreferences(String fileName, String userName, int userPswd) { 7 boolean isSaveDataSuccess = false; //儲存資料成功標誌位 8 SharedPreferences sharedPreferences = mContext.getSharedPreferences(fileName, Context.MODE_PRIVATE); 9 SharedPreferences.Editor edit = sharedPreferences.edit(); //建立SharedPreferences.Editor對象10 edit.putString("userName", userName); //儲存資料11 edit.putInt("userPswd", userPswd);12 isSaveDataSuccess = edit.commit(); //提交儲存資料13 return isSaveDataSuccess;14 }
通過以上的代碼,我們建立了一個Context.MODE_PRIVATE(預設操作模式)的資料存放區檔案,該檔案中可以儲存兩項內容:userName和userPswd。
1.2單體測試
為了驗證以上這段代碼的正確性,我們可以編寫一段單體測試代碼對其進行快速驗證。具體的單體測試代碼如下:
1 /* 2 * Function : 單體測試,儲存資料到SharedPreferences對象中 3 * Author : 部落格園-依舊淡然 4 */ 5 public void saveData() { 6 Context context = getContext(); 7 MySharedPreferences mySharedPreferences = new MySharedPreferences(context); 8 String fileName = "userInfo"; //檔案名稱 9 String userName = "jack"; //儲存的資料10 int userPswd = 123; //儲存的資料11 boolean flag = mySharedPreferences.saveDataToSharedPreferences(fileName, userName, userPswd);12 Log.i(TAG, "-->>" + flag);13 }
運行該單體測試,我們可以看到Log日誌中,flag列印結果為true,表明資料存放區成功。並且我們建立了一個名為“userInfo”的隱藏檔,並在其中儲存了兩條資料內容:userName = "jack"和userPswd = 123。
那麼,“userInfo”檔案究竟被存放到了什麼地方呢?答案是/data/data/<包名>/shared_prefs目錄下,2所示。
圖2 Shared Preferences方式儲存資料的檔案目錄
有一點需要注意,以Shared Preferences方式儲存資料時,檔案會預設的以xml的格式進行儲存。
開啟“userInfo.xml”檔案,可以看到其中內容3所示。
圖3 “userInfo.xml”檔案內容
可見,通過以上的代碼確實可以實現資料的正確儲存。
1.3使用Shared Preferences讀取資料
那麼,又該如何在程式中讀取儲存在“userInfo.xml”檔案中的內容呢?下面的代碼給出了一種實現的方案。
1 /* 2 * Function : 從SharedPreferences對象中讀取資料 3 * Param : fileName儲存資料的檔案名稱 4 * Author : 部落格園-依舊淡然 5 */ 6 public Map<String, Object> readDataFromSharedPreferences(String fileName) { 7 Map<String, Object> map = new HashMap<String, Object>(); //Map對象,用於儲存讀取到的資料 8 SharedPreferences sharedPreferences = mContext.getSharedPreferences(fileName, Context.MODE_PRIVATE); 9 String userName = sharedPreferences.getString("userName", ""); //讀取SharedPreferences對象中的資料10 int userPswd = sharedPreferences.getInt("userPswd", 0);11 map.put("userName", userName); //將讀取到的資料存入Map對象12 map.put("userPswd", userPswd);13 return map;14 }
通過以上的代碼,實現了從Shared Preferences對象中讀取資料,並將讀取到的資料儲存到了Map對象中。