前言:
最近一直在學習ios的數據存儲,當學習到NSUserDefaults的時候讓我回想起了SharedPreferences,今天閑來無事,想着總結一下SharedPreferences的使用。
什么是SharedPreferences存儲?
SharedPreferences是基礎key-value(鍵值對)來存儲一些輕量數據的存儲方式,特別適用於保存軟件配置參數。使用SharedPreferences 保存數據,其背后是用xml文件存放數據,文件存放在/data/data/<package name>/shared_prefs。
具體是怎么使用的?
1.)寫入數據
SharedPreferences sharedPreferences= getSharedPreferences("test", Activity.MODE_PRIVATE); //實例化SharedPreferences.Editor對象 SharedPreferences.Editor editor = sharedPreferences.edit(); //用putString的方法保存數據 editor.putBoolean(USER_ISLOGIN,true); editor.putString(USER_ID, "123456"); editor.putString(USER_PWD, "pwd123"); //提交當前數據 editor.apply();
2.)讀取數據
SharedPreferences sharedPreferences= getSharedPreferences("test", Activity.MODE_PRIVATE); String userId=sharedPreferences.getString(USER_ID,""); String userPwd=sharedPreferences.getString(USER_PWD,""); boolean isLogin=sharedPreferences.getBoolean(USER_ISLOGIN,false); Log.e("","userId---->"+userId); Log.e("","userPwd---->"+userPwd); Log.e("","isLogin---->"+isLogin);
3.)監聽數據變化
SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { } }; sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注冊數據變化監聽 sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注冊數據變化監聽
4.)權限控制
SharedPreferences sharedPreferences= getSharedPreferences("test", Activity.MODE_PRIVATE);
第一個參數是生成xxx.xml文件的文件名字,第二個參數是文件的訪問權限以及文件數據寫入方式。簡單說明一下幾種方式:
Activity.MODE_PRIVATE,//默認操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
Activity.MODE_WORLD_READABLE,//表示當前文件可以被其他應用讀取,
Activity.MODE_WORLD_WRITEABLE,//表示當前文件可以被其他應用寫入;
Activity.MODE_APPEND//該模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件
可以復合使用例如:
如果希望文件被其他應用讀和寫,可以傳入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
5.)看下具體寫入文件的存儲結構:
看到上面的存儲數據那么清晰是不是嚇壞了!對!你沒有看錯!存儲在文件中就是這樣的,純明文存儲沒有一點安全性可言~即使設置了Activity.MODE_PRIVATE權限在ROOT權限面前也是不堪一擊的。所以我們在使用SharedPreferences的時候盡量不要存儲一些有關用戶信息的數據比如本文例子中的userId,userPwd等,如果要存儲那該怎么補救的呢?我們可以把key md5一下例如MD5Utils.md5(USER_ID),value 值加密一下,可以采用AES加密 附上一個AndroidAES加密文章(http://www.cnblogs.com/whoislcj/p/5473030.html)。
6.)數據共享探討
Context otherAppContext = createPackageContext("com.gary.appdisplaycontrol", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppContext.getSharedPreferences("preferences",Context.MODE_WORLD_READABLE|Context.MODE_MULTI_PROCESS);
看了下官方api強烈說明這是一個非常危險的操作。