Android 數(shù)據(jù)存儲(一)SharedPreferences

轉(zhuǎn)載請注明出處:http://www.reibang.com/p/21b266d6b6d7

這篇主要簡單介紹一下Android中存儲數(shù)據(jù)的幾種方式痴奏,然后具體分析下SharedPreferences的使用方法该默。


1 簡介

Android提供了幾個(gè)選項(xiàng)來保存持久的應(yīng)用程序數(shù)據(jù)官撼。 您選擇的解決方案取決于您的具體需求,例如數(shù)據(jù)是否應(yīng)該是您的應(yīng)用程序私有的或其他應(yīng)用程序(和用戶)可訪問的數(shù)據(jù)以及數(shù)據(jù)所需的空間奥吩。
數(shù)據(jù)存儲選項(xiàng)如下:

  • Shared Preferences 保存私人基本數(shù)據(jù)(鍵值對)。
  • Internal Storage 將專有數(shù)據(jù)存儲在設(shè)備內(nèi)存中蕊梧。
  • External Storage 將公共數(shù)據(jù)存儲在共享的外部存儲上霞赫。
  • SQLite Databases 將結(jié)構(gòu)化數(shù)據(jù)存儲在專用數(shù)據(jù)庫中。
  • Network Connection 使用自己的網(wǎng)絡(luò)服務(wù)器將數(shù)據(jù)存儲在網(wǎng)絡(luò)上望几。

Android提供了一種讓您將私人數(shù)據(jù)暴露給其他應(yīng)用程序的方式 - ContetProvider绩脆。ContetProvider是一個(gè)可選組件,可以暴露對應(yīng)用程序數(shù)據(jù)的讀/寫訪問權(quán)限橄抹,無論您想要施加什么限制靴迫。
這篇主要說一下SharedPreferences使用方法。
SharedPreferences是Android提供的一種存儲數(shù)據(jù)的機(jī)制楼誓,用于存儲少量數(shù)據(jù)玉锌,數(shù)據(jù)類型包括(boolean 、int疟羹、long主守、float、string)榄融,主要用于存儲應(yīng)用的配置信息参淫,例如:用戶名、密碼愧杯、是否開啟震動(dòng)涎才、音樂等。
它實(shí)際上是以鍵值對的形式儲存在xml文件中力九。存儲位置:data/data/程序包名/shared_prefs/ 目錄下耍铜。


2 保存數(shù)據(jù)

先看下代碼:

mPreferences = getSharedPreferences("test", Context.MODE_PRIVATE);
mEditor = mPreferences.edit();
mEditor.putInt("int", 1);
mEditor.putBoolean("boolean", true);
mEditor.putFloat("float", 3.14f);
mEditor.putLong("long", 123l);
mEditor.putString("string", "abcd");
mEditor.commit();
mPreferences.registerOnSharedPreferenceChangeListener(mListener);

第1行 通過context獲取SharedPreferences對象SharedPreferences
第一個(gè)參數(shù)表示要操作的xml文件名。
第二個(gè)參數(shù) 操作模式跌前,操作模式如下:Context類中的變量棕兼,類型為public static final int。

  • MODE_PRIVATE = 0x0000; 0 默認(rèn)模式抵乓,指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀伴挚、寫。
  • MODE_WORLD_READABLE = 0x0001; 1 指定數(shù)據(jù)可以被其他應(yīng)用程序讀灾炭,但不能寫章鲤。
    創(chuàng)建可讀的文件是很危險(xiǎn)的,而且可能以引起應(yīng)用程序的安全漏洞咆贬。強(qiáng)烈勸阻;相反,應(yīng)用程序應(yīng)該使用的互動(dòng)更加正式的機(jī)制 如{ContentProvider}帚呼,{BroadcastReceiver}和{android.app.Service}掏缎。此變量在API級別17中已被棄用皱蹦。
  • MODE_WORLD_WRITEABLE = 0x0002; 2 指定數(shù)據(jù)可以被其他應(yīng)用程序?qū)懀荒茏x眷蜈。
    創(chuàng)建可寫文件也是危險(xiǎn)的沪哺,不推薦使用。此變量在API級別17中已被棄用酌儒。
  • MODE_MULTI_PROCESS = 0x0004; 4 文件將會(huì)在SharedPreference實(shí)例被裝載到進(jìn)程的時(shí)候檢查是否被修改,主要用在一個(gè)應(yīng)用有多個(gè)進(jìn)程的情況辜妓。

第2行 獲取Editor對象,通過editor對象來更改SharedPreferences中的內(nèi)容忌怎。
第3~7行 設(shè)置鍵值對籍滴。
第8行 提交修改。(很重要榴啸,如果不執(zhí)行則并沒有更改數(shù)據(jù))孽惰。

查看下Editor的一些方法:


Editor方法

以put開頭的是設(shè)置鍵值對的方法。rmove方法用來移除某鍵值對鸥印。
apply() 和commit()都可以用來保存修改勋功。

  • commit()有返回值,成功返回true,失敗返回false。將內(nèi)容修改從編輯器提交到SharedPreferences對象库说,這是原子到執(zhí)行修改狂鞋,替換當(dāng)前在SharedPreferences中的任何內(nèi)容。注意:當(dāng)兩個(gè)編輯器同時(shí)修改內(nèi)容時(shí)潜的,最后一個(gè)調(diào)用提交覆蓋之前的更改骚揍。如果不關(guān)心返回值,并且從應(yīng)用程序的主線程中使用該值夏块,請考慮使用apply()疏咐。return 如果返回true,則表示將新值寫入持久存儲(硬件磁盤)成功脐供,否則表示寫入失敗浑塞。
  • apply()沒有返回值,apply()是將修改的數(shù)據(jù)提交到內(nèi)存, 而后異步真正的提交到硬件磁盤,不會(huì)通知任何失敗政己。
    如果SharedPreferences的另一個(gè)編輯器editor在apply異步提交傷胃完成時(shí)定期進(jìn)行commit酌壕,則commit將阻塞,直到所有異步提交完成歇由。
    由于SharedPreferences在一個(gè)進(jìn)程中是單列的卵牍,如果忽略了返回值,可以安全的替換任何commit 到apply沦泌。

我這個(gè)代碼包名是cn.vn.sharedpreferencesdemo糊昙,所以xml文件路徑為:/data/data/cn.vn.sharedpreferencesdemo/shared_prefs/test.xml。
內(nèi)容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <boolean name="boolean" value="true" />
    <long name="long" value="123" />
    <float name="float" value="3.14" />
    <int name="int" value="1" />
    <string name="string">abcd</string>
</map>

3 獲取數(shù)據(jù)

代碼如下:

int a = mPreferences.getInt("int", 0);
boolean bool = mPreferences.getBoolean("boolean", false);
float f = mPreferences.getFloat("float", 0.0f);
long l = mPreferences.getLong("long", 0);
String s = mPreferences.getString("string", "");
String wifi = mPreferences.getString("wifi", "5566");

變量值如下:

06-27 11:55:42.328 I/MainActivity( 2408): a=1
06-27 11:55:42.328 I/MainActivity( 2408): bool=true
06-27 11:55:42.328 I/MainActivity( 2408): f=3.14
06-27 11:55:42.328 I/MainActivity( 2408): l=123
06-27 11:55:42.328 I/MainActivity( 2408): s=abcd
06-27 11:55:42.328 I/MainActivity( 2408): wifi=5566

以getInt為例谢谦,第一個(gè)參數(shù)為鍵值释牺,第二個(gè)參數(shù)為默認(rèn)值(如果SharedPreferences中沒有該鍵值則返回該值)萝衩。其他道理類似。


4 監(jiān)聽數(shù)據(jù)改變

SharedPreferences類中提供了監(jiān)聽數(shù)據(jù)變化的接口没咙,代碼如下

private OnSharedPreferenceChangeListener mListener= 
        new OnSharedPreferenceChangeListener() {
    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        Log.i(TAG, "Changed key="+key);
    }
};
//注冊監(jiān)聽
mPreferences.registerOnSharedPreferenceChangeListener(mListener);

當(dāng)SharedPreferences中的數(shù)據(jù)修改后猩谊,會(huì)回調(diào)mListener中的onSharedPreferenceChanged方法,通過參數(shù)key可以知道哪個(gè)鍵值進(jìn)行了變動(dòng)祭刚。
我們來嘗試修改一下:

mEditor.putInt("int", 1);
mEditor.putString("string", "ab");
mEditor.remove("long");
mEditor.commit();

打印如下:

06-27 11:55:47.015 I/MainActivity( 2408): Changed key=string
06-27 11:55:47.015 I/MainActivity( 2408): Changed key=long

由于原先的int鍵對應(yīng)的值為1牌捷,該值沒有改變,所以不會(huì)回調(diào)onSharedPreferenceChanged涡驮。而string鍵的值由abcd變成了ab暗甥,刪除了long鍵,所以這兩個(gè)鍵更改都有回調(diào)遮怜。

取消監(jiān)聽SharedPreference

mPreferences.unregisterOnSharedPreferenceChangeListener(mListener);

以上就是SharedPreferences的簡單用法淋袖。其中還有一些坑需要去走。

歡迎大家關(guān)注锯梁、評論即碗、點(diǎn)贊
你們的支持是我堅(jiān)持的動(dòng)力陌凳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剥懒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子合敦,更是在濱河造成了極大的恐慌初橘,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件充岛,死亡現(xiàn)場離奇詭異保檐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崔梗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門夜只,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒜魄,你說我怎么就攤上這事扔亥。” “怎么了谈为?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵旅挤,是天一觀的道長。 經(jīng)常有香客問我伞鲫,道長粘茄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任秕脓,我火速辦了婚禮柒瓣,結(jié)果婚禮上瘪菌,老公的妹妹穿的比我還像新娘。我一直安慰自己嘹朗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布诵肛。 她就那樣靜靜地躺著屹培,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怔檩。 梳的紋絲不亂的頭發(fā)上褪秀,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音薛训,去河邊找鬼媒吗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乙埃,可吹牛的內(nèi)容都是我干的闸英。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼介袜,長吁一口氣:“原來是場噩夢啊……” “哼甫何!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遇伞,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤辙喂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鸠珠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巍耗,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年渐排,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了炬太。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡飞盆,死狀恐怖娄琉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吓歇,我是刑警寧澤孽水,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站城看,受9級特大地震影響女气,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜测柠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一炼鞠、第九天 我趴在偏房一處隱蔽的房頂上張望缘滥。 院中可真熱鬧,春花似錦谒主、人聲如沸朝扼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擎颖。三九已至,卻和暖如春观游,著一層夾襖步出監(jiān)牢的瞬間搂捧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工懂缕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允跑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓搪柑,卻偏偏與公主長得像聋丝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子拌屏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

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