Android存儲基礎(chǔ)之SharedPreferences

導(dǎo)圖

sp使用

準(zhǔn)備

一些基本使用方法,這里就不過多介紹,大家可以參考官方文檔.

ps:這里吐槽一下官方的對sharedPreferences的翻譯,叫共享首選項(xiàng).無語,讓我想起了阿賈克斯(AJAX)和酷容(Chrome),一臉黑線

這里簡單總結(jié)一下

SharedPreferences(后面簡稱sp)本身是一個(gè)接口,程序無法直接創(chuàng)建sp的實(shí)例.只能通過Context提供的getSharedPreferences(String name,int mode)方法來獲取sp的實(shí)例.sp本身為接口類型,并沒有提供寫入數(shù)據(jù)的能力,而是通過內(nèi)部接口Editor來實(shí)現(xiàn)寫入數(shù)據(jù)的能力.所以寫數(shù)據(jù)需要通過調(diào)用editor來寫數(shù)據(jù),讀數(shù)據(jù)可以直接用sp的方法實(shí)現(xiàn).

preferences = getSharedPreferences(PREFNAME, MODE_PRIVATE);  //1.創(chuàng)建sp
preferences.edit().
                putString("time", new SimpleDateFormat().format(new Date())).
                putInt("random", ((int) (Math.random() * 100))).
                commit();  //2.存
String time = preferences.getString("time", null);  //取
int value = preferences.getInt("random", 0);

好了,就是這么簡單.正因?yàn)槭褂煤唵?所以在開發(fā)過程中,使用的頻率也是最多的.

如何調(diào)試

sp在我看來就是一種簡單的存儲方式,本身還是io操作.sp文件也是常見的xml文件,也就是是說我們完全可以通過io的方式來訪問sp文件,其實(shí)就是解析xml文件.只是沒有這個(gè)必要,直接使用sp提供的api很方便簡潔.生成的sp文件放在data/data/<package name>/shared_prefs目錄下,可以通過模擬器直接打開,如果是真機(jī)需要root才能訪問.為了方便調(diào)試,facebook提供了一個(gè)方便的工具,stetho.可以直接在瀏覽器中查看app中的創(chuàng)建的sp文件.非常方便.效果如下

apply和commit的區(qū)別

  • commit這種方式很常用,api1中就已經(jīng)加入了.這個(gè)提交修改方式是同步的,會阻塞調(diào)用它的線程,并且這個(gè)方法會返回boolean值告知保存是否成功(如果不成功界赔,可以做一些補(bǔ)救措施)。
  • apply 是api9加入的方式,是異步的.AS也會提示大家使用這種方式.
    結(jié)論.一般對提交結(jié)果不關(guān)心的會用apply.如果要求確保提交成功,提交成功后有后續(xù)動作的話還是用commit.

存取復(fù)雜數(shù)據(jù)

sp的存在是為了大家保存相對較小的鍵值集合,可以保存布爾值较性、浮點(diǎn)值庐氮、整型值炬转、長整型和字符串.總的來說就是一些簡單的數(shù)據(jù)格式.一般用來保存
軟件設(shè)置、用戶賬戶設(shè)置,用戶習(xí)慣設(shè)置等.但是還是會有人喪心病狂的來保存比較復(fù)雜的數(shù)據(jù).比如對象,圖片.具體做法就是:使用Base64把Product對象和圖片進(jìn)行編碼成字符串后冀膝,然后通過 SharedPreferences 把轉(zhuǎn)換后的字符串保存到xml文件中浮庐,在需要使用該對象或者圖片時(shí)甚负,通過Base64把從 SharedPreferences 獲取的字符串解碼成對象或者圖片再使用。
結(jié)論:雖然可以采用編碼的方式通過sp來保存任何類型的數(shù)據(jù),但是不建議使用sp保存很大的數(shù)據(jù).如果需要存取大數(shù)據(jù),還是通過文件存儲的或者sqlite的方式.這個(gè)我們?nèi)蘸笤诒?

一些坑

  • 讀取頻繁的key和不易變動的key盡量不要放在一起审残,影響速度梭域。
  • 不要多吃edit多吃apply,像這樣
SharedPreferences sp = getSharedPreferences("test", MODE_PRIVATE);
sp.edit().putString("test1", "sss").apply();
sp.edit().putString("test2", "sss").apply();
sp.edit().putString("test3", "sss").apply();
sp.edit().putString("test4", "sss").apply();

每次edit都會創(chuàng)建一個(gè)Editor對象,額外占用內(nèi)存,另外多吃apply也會卡界面.所以不要無節(jié)制的使用apply.多次修改一次apply.

  preferences.edit().
                putString("time", new SimpleDateFormat().format(new Date())).
                putInt("random", ((int) (Math.random() * 100))).
                apply();
  • 不要使用這個(gè)用來跨線程,這個(gè)在android中不是很穩(wěn)定,如果需要還是使用ContentProvider.

下級預(yù)告

Android基礎(chǔ)之fragment

參考鏈接

  1. http://shaohui.me/2016/10/20/%E5%85%B3%E4%BA%8ESharedPreference%E8%B8%A9%E7%9A%84%E9%82%A3%E4%BA%9B%E5%9D%91/
  2. http://weishu.me/2016/10/13/sharedpreference-advices/
  3. http://www.reibang.com/p/ae2c7004179d
  4. http://www.reibang.com/p/4dd53e1be5ba/comments/2931815
  5. https://developer.android.com/training/basics/data-storage/shared-preferences.html
  6. https://developer.android.com/guide/topics/data/data-storage.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市搅轿,隨后出現(xiàn)的幾起案子病涨,更是在濱河造成了極大的恐慌,老刑警劉巖璧坟,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件既穆,死亡現(xiàn)場離奇詭異,居然都是意外死亡雀鹃,警方通過查閱死者的電腦和手機(jī)幻工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褐澎,“玉大人会钝,你說我怎么就攤上這事。” “怎么了迁酸?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵先鱼,是天一觀的道長。 經(jīng)常有香客問我奸鬓,道長焙畔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任串远,我火速辦了婚禮宏多,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘澡罚。我一直安慰自己伸但,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布留搔。 她就那樣靜靜地躺著更胖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隔显。 梳的紋絲不亂的頭發(fā)上却妨,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音括眠,去河邊找鬼彪标。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掷豺,可吹牛的內(nèi)容都是我干的捞烟。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼当船,長吁一口氣:“原來是場噩夢啊……” “哼坷襟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起生年,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓奕,沒想到半個(gè)月后抱婉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桌粉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年蒸绩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铃肯。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡患亿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情步藕,我是刑警寧澤惦界,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站咙冗,受9級特大地震影響沾歪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雾消,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一灾搏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧立润,春花似錦狂窑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至到旦,卻和暖如春旨巷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背添忘。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工采呐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搁骑。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓斧吐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仲器。 傳聞我的和親對象是個(gè)殘疾皇子煤率,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容