SharedPreferences輕量存儲的詳細使用,以及工具類的編寫

SharedPreferences簡介

Sharedpreferences是Android平臺一個輕量級的存儲類,用來保存應用程序的一些簡單信息,是一個以“鍵值”對的方式保存數據的xml文件,產生的文件保存在/data/data/應用包名/shared_prefs目錄下,是日常開發非常常用的一個數據存儲類。

常用於:比如我們要保存一個用戶是否第一次進入軟件、用戶的賬號、是否勾選了保存密碼等等這一類比較簡單的信息

注意事項:可以看到圖中,所有數據在手機root情況下,進入文件夾,都是一展無遺的,所以如果有重要的數據最好是進行加密後再存儲

其文件內容如圖:

在這裏插入圖片描述

SharedPreferences保存數據

實例化

SharedPreferences的實例化也有幾種不同的方法,比如

  1. Context類中的getSharedPreferences()方法

  2. Activity類中的getPreferences()方法

  3. PreferenceManager 類中的 getDefaultSharedPreferences()方法

    這裏我們主要講最常用的Context類中的getSharedPreferences()方法

SharedPreferences sharedPreferences = getSharedPreferences("filename", MODE_PRIVATE);

這裏我們需要傳入兩個參數:

name:

也就是你保存到/data/data/應用包名/shared_prefs目錄下的文件的名字

mode:操作模式

  • MODE_PRIVATE: 保存的數據只能被本應用讀、寫;
  • MODE_WORLD_READABLE: 保存的數據能被其他應用程序讀,但不能寫;
  • MODE_WORLD_WRITEABLE: 保存的數據能被其他應用程序讀寫;
  • MODE_APPEND:檢查文件是否存在,存在就往文件加內容,不存在就創建新文件;
Editor

光有SharedPreferences對象是不能進行數據保存的,需要一個SharedPreferences.Editor對象才能對數據進行插入保存,所以我們還需要實例化一個Editor

SharedPreferences.Editor editor = sharedPreferences.edit();
存儲數據

有了Editor,我們就能進行存儲數據了,可以存儲的數據類型也是多達6種:String、int、boolean、float、long還有Set< String > ,所有的數據都是以鍵值對(key-value)的形式存入到文件中,只需要調用Editor的 .putXxxx() 方法,傳入 key 和你需要存儲的數據即可

	    editor.putString("string", "abc");
        editor.putInt("int", 123);
        editor.putFloat("float", 0.001f);
        editor.putBoolean("boolean", true);
        editor.putLong("long", 123123);
        editor.putStringSet("str_set", Set<String>);
提交保存

put了數據還只是相當於在半路中,想要真正把數據保存下來,還需要進行一個提交,這裏的提交又有兩種方法:

  • .apply() 無返回值,簡單理解成 異步提交
  • .commit() 有返回值(返回true代表存儲成功,否則存儲失敗),簡單理解成 同步提交

所以一般情況下我們是優先選擇 .apply() 方法進行提交保存數據的。

editor.apply();

SharedPreferences獲取數據

保存了數據,那麼怎麼獲取?獲取的話相比保存數據而言要稍微簡單那麼一丟丟,獲取是不需要Editor對象的,直接使用SharedPreferences對象調用 .getXxxx() 方法,傳入你之前保存數據時傳入的 key ,然後再傳入一個未獲取到數據時應用的 默認值 即可獲取數據

sharedPreferences.getString("string","");
sharedPreferences.getInt("string",0);
sharedPreferences.getFloat("string",0);
sharedPreferences.getBoolean("string",false);
sharedPreferences.getLong("string",0);
sharedPreferences.getStringSet("string", Set<String>());
defValue默認值

獲取數據時,需要傳入 key ,和一個 defValue ,這個默認值,就是當你的key沒有找到相應的 key 時,那麼就會返回這個 defValue

工具類的編寫

由於SharedPreferences是開發中比較常用的一種數據存儲方式,所以一個工具類也是非常有必要的存在,在這裏也會拓展幾個SharedPreferences裏上面沒有講到的方法,接下來一步步帶你理解,畢竟理解萬歲嘛!

創建一個 工具類

創建一個SpUtils.java,並寫好幾個無論是存儲數據,還是獲取數據都需要用到的對象和常量,這些都不用多說

public class PreferencesUtils {
    
    //SharePreferences保存在本地的文件名
    private static final String SHARE_DATA = "share_data";
    private static SharedPreferences sp;
    private static SharedPreferences.Editor editor;
    
}
存儲數據的方法

這裏呢,put() 方法,傳入Context、key、和一個Object,也就是 上下文、存儲數據時的key,和一個Object對象,爲什麼用Object呢?

優點:如果這裏不用Object,而是一個 String 或者是 int 、float 之類的數據類型,那麼你想想,你要寫多少個靜態方法?String 的寫一個,int 的寫一個,float 的還要寫一個… 那麼用Object呢,就可以很好地避免這種情況的發生,無論你傳入的是什麼類型,我們都照單全收。

那麼問題又來了:我們剛剛也講到了,每個數據類型需要調用的 .putXxxx() 方法是不一樣的,彆着急,接着看

所以我們就需要用一個 if 語句來對傳入的數據類型進行一個判斷,這裏用到了 instanceof 關鍵字,也就是說當你傳入的數據是String 類型時,我們調用 .putString() ,傳入 int 數據類型時,我們調用 .putInt() 方法,以此類推,這樣就很好地解決了這個問題。

最後 editor.apply(); ,存儲數據的方法就算是寫完了,可以開始愉快地存儲數據了!

public static void put(Context context, String key, Object value) {

        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);

        editor = sp.edit();

        if (value instanceof String) {
            editor.putString(key, (String) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (Boolean) value);
        } else if (value instanceof Integer) {
            editor.putInt(key, (Integer) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (Float) value);
        } else if (value instanceof Long) {
            editor.putLong(key, (Long) value);
        } else {
            editor.putString(key, value.toString());
        }

        editor.apply();
    }

獲取數據的方法

這裏的參數邏輯和上面 存儲數據方法 的邏輯是一樣的,只不過這裏是通過判斷 傳入的默認值,來進行判斷,然後調用對應的 .getXxxx() 方法,再return返回數據

public static Object get(Context context, String key, Object defaultValue) {

        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);

        if (defaultValue instanceof String) {
            return sp.getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultValue);
        } else if (defaultValue instanceof Integer) {
            return sp.getInt(key, (Integer) defaultValue);
        } else if (defaultValue instanceof Float) {
            return sp.getFloat(key, (Float) defaultValue);
        } else if (defaultValue instanceof Long) {
            return sp.getLong(key, (Long) defaultValue);
        }

        return null;
    }
補充兩個方法
  • 清除所有數據

這裏,調用此方法後,你當前 文件名 下的所有數據將會被清除

public static void clean(Context context) {
        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);
        editor = sp.edit();
        editor.clear();
        editor.apply();
    }
  • 獲取所有的鍵值對

返回當前 文件名 下所有的鍵值對,也就是你存儲的所有數據,這裏的返回類型是一個Map< String , ?>

public static Map<String, ?> getAll(Context context) {
        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);
        return sp.getAll();
    }

看完文章,覺得還不錯的話,點個贊吧!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章