前言:
最近一直在學習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強烈說明這是一個非常危險的操作。