所有的應(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ù)則簡單很多缎浇。