轉(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的一些方法:
以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)力陌凳。