Android學習筆記35:使用Shared Preferences方式存儲數據


  在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對象中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM