在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.Edit對象存儲數據。
(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對象中。