文章目錄
SharedPreferences簡介
Sharedpreferences是Android平臺一個輕量級的存儲類,用來保存應用程序的一些簡單信息,是一個以“鍵值”對的方式保存數據的xml文件,產生的文件保存在/data/data/應用包名/shared_prefs目錄下,是日常開發非常常用的一個數據存儲類。
常用於:比如我們要保存一個用戶是否第一次進入軟件、用戶的賬號、是否勾選了保存密碼等等這一類比較簡單的信息
注意事項:可以看到圖中,所有數據在手機root情況下,進入文件夾,都是一展無遺的,所以如果有重要的數據最好是進行加密後再存儲
其文件內容如圖:
SharedPreferences保存數據
實例化
SharedPreferences的實例化也有幾種不同的方法,比如
-
Context類中的getSharedPreferences()方法
-
Activity類中的getPreferences()方法
-
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();
}
看完文章,覺得還不錯的話,點個贊吧!