SharedPreferences

所有的應(yīng)用程序都必然涉及數(shù)據(jù)的輸入與輸出凯旋。在Android系統(tǒng)中辟犀,主要有五種數(shù)據(jù)存儲(chǔ)模式:

1 .Sharedferences:Sharedferences是一種輕型的數(shù)據(jù)存儲(chǔ)方式,本質(zhì)上是基于XML文件存儲(chǔ)key-value鍵值對(duì)數(shù)據(jù)出皇。通常用來存儲(chǔ)一些簡單的配置信息羞芍;

2 .File:使用文件進(jìn)行數(shù)據(jù)存儲(chǔ);

3 .SQLite:SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫郊艘,存儲(chǔ)結(jié)構(gòu)化的數(shù)據(jù)荷科,支持基本SQL語法唯咬,是常被采用的一種數(shù)據(jù)存儲(chǔ)方式。Android為SQLite提供了一個(gè)名為SQLiteDatabase的類畏浆,封裝了一些CRUD操作的API胆胰;

4 .ContentProvider:ContentProvider為存儲(chǔ)和獲取數(shù)據(jù)提供統(tǒng)一的接口,可以在不同的應(yīng)用程序之間共享數(shù)據(jù)刻获;

5 .Network:使用基于網(wǎng)絡(luò)的服務(wù)獲取數(shù)據(jù)蜀涨。

其中,前四種為本地?cái)?shù)據(jù)持久化的存儲(chǔ)方式蝎毡。

當(dāng)應(yīng)用程序只有少量數(shù)據(jù)需要保存厚柳,而且這些數(shù)據(jù)的格式很簡單,譬如都是String沐兵、Int草娜、Long、Float和Boolean等簡單數(shù)據(jù)類型時(shí)痒筒,可以使用SharedPreferences來保存,常用于保存應(yīng)用程序的各種配置信息(是否使用振動(dòng)效果茬贵、字體大小等)簿透;

當(dāng)應(yīng)用程序只有少量數(shù)據(jù)需要保存,而且這些數(shù)據(jù)的格式比較復(fù)雜解藻,可以使用普通文件保存老充;

當(dāng)應(yīng)用程序有大量數(shù)據(jù)需要存儲(chǔ)和訪問,就可以使用SQLite數(shù)據(jù)庫來保存螟左。SQLite是一個(gè)真正輕量級(jí)的數(shù)據(jù)庫啡浊,它沒有后臺(tái)進(jìn)程,整個(gè)數(shù)據(jù)庫就對(duì)應(yīng)于一個(gè)文件胶背;

當(dāng)應(yīng)用程序需要引用其他應(yīng)用程序如多媒體播放巷嚣、通訊錄等的數(shù)據(jù)時(shí),可以使用ContentProvider來調(diào)用數(shù)據(jù)接口钳吟;

當(dāng)應(yīng)用程序需要的數(shù)據(jù)需要跨設(shè)備和持久保存廷粒,就不能保存在本地,而應(yīng)該采用網(wǎng)絡(luò)服務(wù)器存儲(chǔ)數(shù)據(jù)红且。

本文主要講解SharedPreferences的使用與應(yīng)用坝茎。

一. SharedPreferences的重要方法

1 . 讀取SharedPreferences數(shù)據(jù)的方法

方法描述

boolean contains (String key)判斷SharedPreferences是否包含特定key的數(shù)據(jù)。

abstract MapgetAll()獲取SharedPreferences數(shù)據(jù)中全部的鍵值對(duì)數(shù)據(jù)集合暇番。

abstract Xxx getXxx(String key, Xxx defaultValue)獲取SharedPreferences數(shù)據(jù)里指定key對(duì)應(yīng)的value嗤放。如果key不存在,則返回defaultValue壁酬。其中次酌,Xxx可以是boolean恨课、int、float和措、long庄呈、String。

abstract SetgetStringSet(String key, SetdefValues)獲取SharedPreferences數(shù)據(jù)中指定key對(duì)應(yīng)的Set值派阱。

2. 向SharedPreferences寫入數(shù)據(jù)的方法

SharedPreferences對(duì)象本身只能獲取數(shù)據(jù)而不支持存儲(chǔ)和修改诬留,存儲(chǔ)修改是通過通過SharedPreferences的內(nèi)部接口SharedPreferences.Editor實(shí)現(xiàn)的。SharedPreferences調(diào)用edit()方法即可獲取它對(duì)應(yīng)的Editor對(duì)象贫母。其中Editor對(duì)象向SharedPreferences寫入數(shù)據(jù)的方法如下:

方法描述

abstract SharedPreferences.Editor

putXxx(String key, Xxx value)向Editor對(duì)象存入指定key對(duì)應(yīng)的value數(shù)據(jù)文兑。其中,Xxx可以是boolean腺劣、int绿贞、float、long橘原、String籍铁。

abstract SharedPreferences.Editor

clear()清空Editor對(duì)象中的數(shù)據(jù)。

abstract SharedPreferences.Editor

remove(String key)刪除Editor對(duì)象中指定的key對(duì)應(yīng)的數(shù)據(jù)趾断。

abstract SharedPreferences.Editor

putStringSet(String key, Setvalues)向Editor對(duì)象存入指定key對(duì)應(yīng)的Set值拒名。

abstract boolean commit()當(dāng)Editor對(duì)象編輯完成后,調(diào)用該方法提交修改芋酌。

abstract void apply()提交Editor對(duì)象的修改增显。

二. 向SharedPreferences中存儲(chǔ)數(shù)據(jù)

SharedPreferences本身是一個(gè)接口,不能直接創(chuàng)建SharedPreferences實(shí)例脐帝,可以通過Context提供的getSharedPreferences(String name, int mode)方法來獲取SharedPreferences實(shí)例同云。其中,該方法中的mode參數(shù)可取的值有:

Context.MODE_PRIVATE:指定SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀堵腹、寫炸站;

Context.MODE_WORLD_READABLE:指定SharedPreferences可被其他應(yīng)用程序讀,但不能寫疚顷;

Context.MODE_WORLD_WRITABLE:指定SharedPreferences數(shù)據(jù)可被其他應(yīng)用程序讀武契、寫。

實(shí)現(xiàn)SharedPreferences存儲(chǔ)的步驟如下:

1 . 創(chuàng)建SharedPreferences對(duì)象荡含;

2 . 創(chuàng)建SharedPreferences.Editor對(duì)象咒唆,用于存儲(chǔ)數(shù)據(jù)修改;

3 . 通過Editor對(duì)象的putXxx()方法释液,存儲(chǔ)key-value對(duì)數(shù)據(jù)信息全释;

4 . 通過Editor對(duì)象的commit()方法提交對(duì)SharedPreferences的修改。

實(shí)例如下:

/*

* 創(chuàng)建SharedPreferences實(shí)例

* 其中"myPref"指SharedPreferences數(shù)據(jù)的XML文件名

* 指定該SharedPreferences數(shù)據(jù)只能被本應(yīng)用程序讀寫

*/SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE);// 創(chuàng)建SharedPreferences.Editor對(duì)象误债,用于存儲(chǔ)數(shù)據(jù)修改SharedPreferences.Editor editor = pref.edit();// 存儲(chǔ)數(shù)據(jù)信息editor.putString("name","zhangsan");editor.putInt("age",22);editor.putLong("time", System.currentTimeMillis());editor.putBoolean("default",true);// 提交數(shù)據(jù)修改editor.commit();

這樣就完成了SharedPreferences的數(shù)據(jù)寫入了浸船。

在Android Studio的DDMS中可以查看"myPref"XML文件信息妄迁。myPref.xml所在的文件目錄為 "/data/data/<包名>/shared_prefs/myPref.xml" 。DDMS的打開步驟如下:

"Tools"菜單 ->"Android"菜單 ->"Android Device Monitor"菜單李命,即可打開DDMS登淘。

在DDMS中查看Android虛擬機(jī)下對(duì)應(yīng)的"/data/data/<包名>/shared_prefs/myPref.xml",并導(dǎo)出myPref.xml至本地電腦中查看封字,可看到myPref.xml文件內(nèi)容如下:

zhangsan

三. 讀取本應(yīng)用程序的SharedPreferences

所有創(chuàng)建的SharedPreferences數(shù)據(jù)都可以被本應(yīng)用訪問并進(jìn)行讀寫操作黔州。

實(shí)現(xiàn)SharedPreferences讀取的步驟如下:

1 . 獲取SharedPreferences對(duì)象;

2 . 獲取SharedPreferences中的數(shù)據(jù)阔籽。

// 1. 獲取SharedPreferences對(duì)象SharedPreferences pref = getSharedPreferences("myPref", MODE_PRIVATE);// 2. 取出數(shù)據(jù)String name = pref.getString("name","defaultName");Intage = pref.getInt("age",0);Longtime = pref.getLong("time",0);Booleandefault= pref.getBoolean("default",true);

四. 讀寫其他應(yīng)用程序的SharedPreferences數(shù)據(jù)

要讀寫其他應(yīng)用程序的SharedPreferences流妻,前提是該應(yīng)用程序的SharedPreferences需要指定相應(yīng)權(quán)限,如Context.MODE_WORLD_READABLE(可讀笆制,不可寫)绅这、Context.MODE_WORLD_WRITABLE(可讀寫)。

假設(shè)要讀取的應(yīng)用程序的的SharedPreferences數(shù)據(jù)具有Context.MODE_WORLD_WRITABLE權(quán)限在辆。為了讀取該應(yīng)用程序的的SharedPreferences证薇,步驟如下:

第一步:創(chuàng)建其他應(yīng)用程序?qū)?yīng)的Context

創(chuàng)建其他應(yīng)用程序?qū)?yīng)的Context的方法如下:

createPackageContext(StringpackageName,intflags)

其中packageName為該應(yīng)用程序的包名。flag表示該應(yīng)用程序的安全限制標(biāo)記匆篓。flag的取值如下:

CONTEXT_INCLUDE_CODE:可以執(zhí)行程序包里的代碼浑度;

CONTEXT_IGNORE_SECURITY:忽略安全警告;

CONTEXT_RESTRICTED:嚴(yán)格模式奕删,可能導(dǎo)致一些特殊特性不可用;

示例:

otherAppContext= createPackageContext("cn.edu.sysu.ce.hope", Context.CONTEXT_IGNORE_SECURITY);

第2步:調(diào)用其它應(yīng)用程序的Context的SharedPreferences對(duì)象

// 獲取SharedPreferences對(duì)象SharedPreferences pref = otherAppContext.getSharedPreferences("myPref", MODE_PRIVATE);

第3步:向SharedPreferences對(duì)象中讀寫數(shù)據(jù)

1 . 讀取數(shù)據(jù):

String name = pref.getString("name","defaultName");Intage = pref.getInt("age",0);Longtime = pref.getLong("time",0);Booleandefault= pref.getBoolean("default",true);

2 . 寫入數(shù)據(jù):

// 獲取SharedPreferences.Editor對(duì)象疗认,用于存儲(chǔ)數(shù)據(jù)修改SharedPreferences.Editor editor = pref.edit();// 修改數(shù)據(jù)信息editor.putString("name","lisi");editor.putBoolean("isMale",true);// 提交數(shù)據(jù)修改editor.commit();

因?yàn)镾haredPreferences的數(shù)據(jù)存儲(chǔ)格式就是一個(gè)XML文件完残,所以我們完全可以通過使用I/O流的方式讀取該XML文件,再通過XML解析來獲取數(shù)據(jù)横漏。但是顯然谨设,這種方式是很繁瑣,而是用SharedPreferences讀寫數(shù)據(jù)則簡單很多缎浇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末扎拣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子素跺,更是在濱河造成了極大的恐慌二蓝,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件指厌,死亡現(xiàn)場離奇詭異刊愚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)踩验,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門鸥诽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來商玫,“玉大人,你說我怎么就攤上這事牡借∪” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵钠龙,是天一觀的道長炬藤。 經(jīng)常有香客問我,道長俊鱼,這世上最難降的妖魔是什么刻像? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮并闲,結(jié)果婚禮上细睡,老公的妹妹穿的比我還像新娘。我一直安慰自己帝火,他們只是感情好溜徙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犀填,像睡著了一般蠢壹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上九巡,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天图贸,我揣著相機(jī)與錄音,去河邊找鬼冕广。 笑死疏日,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的撒汉。 我是一名探鬼主播沟优,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睬辐!你這毒婦竟也來了挠阁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤溯饵,失蹤者是張志新(化名)和其女友劉穎侵俗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丰刊,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坡慌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了藻三。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洪橘。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跪者,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熄求,到底是詐尸還是另有隱情渣玲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布弟晚,位于F島的核電站忘衍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卿城。R本人自食惡果不足惜拣凹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一节腐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦徽职、人聲如沸怠蹂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至怀偷,卻和暖如春家厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背椎工。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來泰國打工饭于, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人维蒙。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓掰吕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親木西。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畴栖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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