Android應(yīng)用中使用SharedPreferences類(lèi)存儲(chǔ)數(shù)據(jù)的方法
在Android系統(tǒng)中提供了多種存儲(chǔ)技術(shù).通過(guò)這些存儲(chǔ)技術(shù)可以將數(shù)據(jù)存儲(chǔ)在各種存儲(chǔ)介質(zhì)上.比如sharedpreferences可以將數(shù)據(jù)保存著應(yīng)用軟件的私有存儲(chǔ)區(qū),這些存儲(chǔ)區(qū)的數(shù)據(jù)只能被寫(xiě)入這些數(shù)據(jù)的軟件讀取.當(dāng)然Android還支持文件存儲(chǔ)、SQLite數(shù)據(jù)庫(kù)和Content Provider。在這里我們將對(duì)sharedpreferences存儲(chǔ)方式進(jìn)行介紹。
SharedPreferences是一種輕量級(jí)的數(shù)據(jù)存儲(chǔ)方式,學(xué)過(guò)Web開(kāi)發(fā)的同學(xué),可以想象它是一個(gè)小小的Cookie。它可以用鍵值對(duì)的方式把簡(jiǎn)單數(shù)據(jù)類(lèi)型(boolean、int、float、long和String)存儲(chǔ)在應(yīng)用程序的私有目錄下(data/data/包名 /shared_prefs/)自己定義的xml文件中。
SharedPreferences是以鍵值對(duì)來(lái)存儲(chǔ)應(yīng)用程序的配置信息的一種方式,它只能存儲(chǔ)基本數(shù)據(jù)類(lèi)型。一個(gè)程序的配置文件僅可以在本應(yīng)用程序中使用,或者說(shuō)只能在同一個(gè)包內(nèi)使用,不能在不同的包之間使用。實(shí)際上sharedPreferences是采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備中,在DDMS中的File Explorer中的/data/data//shares_prefs下。
在所有的Android SDK存儲(chǔ)技術(shù)中SharedPreferences技術(shù)是最容易理解和使用的,因?yàn)镾haredPreferences處理的就是一個(gè)key–value對(duì)。比如保存產(chǎn)品的名稱,就可以將key設(shè)為produceName,value為實(shí)際的產(chǎn)品名。
一、獲取SharedPreferences對(duì)象的方法
(1)通過(guò)函數(shù)Context.getSharedPreferences(String name,int mode),其中name為本組件的配置文件名(如果想要與本應(yīng)用程序的其他組件共享此配置文件,可以用這個(gè)名字來(lái)檢索到這個(gè)配置文件),mode為操作模式,默認(rèn)的模式為0或MODE_PRIVATE;返回值為SharedPreferences。
(2)通過(guò)函數(shù)Activity.getPreferences(int mode),其中配置文件僅可以被調(diào)用的Activity使用。mode為操作模式,默認(rèn)的模式為0或MODE_PRIVATE;返回值為SharedPreferences。
二、使用SharedPreferences存取數(shù)據(jù)
保存key-value對(duì)一般要指定一個(gè)文件名,然后用類(lèi)似putString的方法指定key和value。SharedPreferences也采用了同樣的方法。使用SharedPreferences保存key-value對(duì)的步驟如下:
(1) 使用Activity類(lèi)的getSharedPreferences方法獲得SharedPreferences對(duì)象。其中存儲(chǔ)key-value的文件名的名稱由getSharedPreferences方法的第一個(gè)參數(shù)指定。
(2) 使用SharedPreferences接口的edit獲得SharedPreferences.Editor對(duì)象。
(3) 通過(guò)SharedPreferences.Editor接口的putXXX方法保存key-value對(duì)。其中XXX表示value的不同數(shù)據(jù)類(lèi)型。Boolean類(lèi)型的value則是用putBoolean方法,字符串類(lèi)型的則為putString方法。
(4) 通過(guò)SharedPreferences.Editor接口的commit方法保存key-value對(duì)。Commit方法相當(dāng)于數(shù)據(jù)庫(kù)事務(wù)中的提交(commit)操作。只有在事件結(jié)束后進(jìn)行提交,才會(huì)將數(shù)據(jù)真正保存在數(shù)據(jù)庫(kù)中。保存key-value也是一樣。
三、數(shù)據(jù)的存儲(chǔ)位置和格式
SharedPreferences將數(shù)據(jù)文件寫(xiě)在手機(jī)內(nèi)存私有的目錄中。在模擬器中測(cè)試程序可以通過(guò)ADT的DDMS透視圖來(lái)查看數(shù)據(jù)文件的位置。
四、保存較為復(fù)雜的類(lèi)型的數(shù)據(jù)
前面介紹的SharedPreferences只能保存簡(jiǎn)單類(lèi)型的數(shù)據(jù),例如,string,int等。如果需要存取比較復(fù)雜的數(shù)據(jù)類(lèi)型比如類(lèi)或者圖像,則需要對(duì)這些數(shù)據(jù)進(jìn)行編碼,通常將其轉(zhuǎn)換成Base64編碼,然后將轉(zhuǎn)換后的數(shù)據(jù)以字符串的形式保存在XML文件中。
五、設(shè)置數(shù)據(jù)文件的訪問(wèn)權(quán)限
因?yàn)锳ndroid系統(tǒng)并不是完全的創(chuàng)新的操作系統(tǒng),而是在linux內(nèi)核基礎(chǔ)上發(fā)展起來(lái)的一個(gè)移動(dòng)操作系統(tǒng),所以android還有一些linux的基本特性。我們用getsharedPreferences方法獲得sharedpreferences對(duì)象,getsharedPreferences方法的第2個(gè)參數(shù)值使用到了Activity.MODE_PRIVATE常量。除了這個(gè)常量以外還可以使用另外3個(gè)常量。這4個(gè)常量用于指定文件的建立模式。他們一個(gè)重要的功能就是設(shè)置文件的屬性,從而可以設(shè)置數(shù)據(jù)文件的訪問(wèn)權(quán)限。
六、可以保存設(shè)置的Activity:PreferenceActivity
由于SharedPreferences可以很容易的保存key-value對(duì),因此,通常使用SharedPreferences保存配置信息。不過(guò)Android SDK提供了更為容易的方法來(lái)設(shè)計(jì)配置界面,并且可以透明地保存配置信息。這就是PreferenceActivity。
PreferenceActivity是Activity的子類(lèi),該類(lèi)封裝了SharedPreferences。因此,PreferenceActivity的所有子類(lèi)都擁有保存key-value對(duì)的能力。
PreferenceActivity提供了一些常用的設(shè)置項(xiàng),這些設(shè)置項(xiàng)可以滿足大多數(shù)的配置界面的要求。與組件一樣,這些配置項(xiàng)既可以從XML文件創(chuàng)建,也可以從代碼創(chuàng)建。比較常用的有:
CheckboxPreference:對(duì)應(yīng)標(biāo)簽。該設(shè)置項(xiàng)會(huì)創(chuàng)建一個(gè)CheckBox組件。
EditTextPreference:對(duì)應(yīng)標(biāo)簽。單擊該設(shè)置項(xiàng)會(huì)彈出一個(gè)帶EditText組件的對(duì)話框。
ListPreference:對(duì)應(yīng)標(biāo)簽。單擊該設(shè)置項(xiàng)會(huì)彈出帶ListView組件的對(duì)話框。
示例
先上圖:
然后是main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/textView" /> </LinearLayout>
activity的代碼:
package cn.com.sharedPreferencesTest; import android.app.Activity; import android.content.SharedPreferences; import android.os.Bundle; import android.util.Log; import android.widget.TextView; public class SharedPreferencesActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); saveSharedPreferences(); readSharedPreferences(); } /** * @description 創(chuàng)建并保存一些設(shè)置信息 */ private void saveSharedPreferences(){ /* * getSharedPreferences(String name,int mode)方法是在Context中定義的抽象方法,在ContextWrapper中進(jìn)行了具體實(shí)現(xiàn), * 該方法會(huì)根據(jù)用戶傳遞的名稱和寫(xiě)入類(lèi)型創(chuàng)建一個(gè)SharedPreferences對(duì)象進(jìn)行返回。 * 在Activity中,還有一個(gè)方法可以回去SharedPreferences對(duì)象,這個(gè)方法就是SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE); * 改方法在Activity中定義并實(shí)現(xiàn),這里沒(méi)有name參數(shù)是因?yàn)樵摲椒J(rèn)將當(dāng)前Activity的類(lèi)名作為name屬性(這里的類(lèi)名并不包含包路徑哦) * */ SharedPreferences sharedPreferences = getSharedPreferences("preferences", MODE_PRIVATE); //存儲(chǔ)數(shù)據(jù) SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("name", "蔡依林"); editor.putInt("age", 31); Boolean b = editor.commit(); if(b){ Log.i("通知:", "保存成功!"); }else{ Log.i("通知", "保存失?。?); } } /** * @author chenzheng_java * @description 讀取我們添加到SharedPreference對(duì)象中的數(shù)據(jù) * @since 2011/03/05 */ private void readSharedPreferences(){ String result = "美女信息:/n" ; SharedPreferences sharedPreferences = this.getSharedPreferences("preferences", MODE_PRIVATE); result+=" 姓名 "+sharedPreferences.getString("name", "暫時(shí)沒(méi)有人"); result+=" 年齡"+sharedPreferences.getInt("age", -1); TextView textView = (TextView)findViewById(R.id.textView); textView.setText(result); } }
其他的都為默認(rèn)。
- android開(kāi)發(fā)教程之實(shí)現(xiàn)toast工具類(lèi)
- Android通過(guò)記住密碼功能學(xué)習(xí)數(shù)據(jù)存儲(chǔ)類(lèi)SharedPreferences詳解及實(shí)例
- 簡(jiǎn)介Android應(yīng)用中sharedPreferences類(lèi)存儲(chǔ)數(shù)據(jù)的用法
- android實(shí)用工具類(lèi)分享(獲取內(nèi)存/檢查網(wǎng)絡(luò)/屏幕高度/手機(jī)分辨率)
- Android屏幕分辨率工具類(lèi)使用詳解
- 封裝的android監(jiān)聽(tīng)手指左右滑動(dòng)屏幕的事件類(lèi)分享
- Android開(kāi)發(fā)實(shí)現(xiàn)的IntentUtil跳轉(zhuǎn)多功能工具類(lèi)【包含視頻、音頻、圖片、攝像頭等操作功能】
- Android開(kāi)發(fā)之多媒體文件獲取工具類(lèi)實(shí)例【音頻,視頻,圖片等】
- android 一些工具類(lèi)匯總
- Android開(kāi)發(fā)中4個(gè)常用的工具類(lèi)【Toast、SharedPreferences、網(wǎng)絡(luò)及屏幕操作】
相關(guān)文章
Android中TelephonyManager類(lèi)的方法實(shí)例分析
這篇文章主要介紹了Android中TelephonyManager類(lèi)的方法,以實(shí)例形式較為詳細(xì)的分析了Android基于TelephonyManager類(lèi)獲取手機(jī)各種常用信息的相關(guān)技巧,需要的朋友可以參考下2015-09-09Android列表實(shí)現(xiàn)(3)_自定義列表適配器思路及實(shí)現(xiàn)代碼
Android 自定義列表適配器會(huì)提供很多的便利;下面的例子為使用自定義的列表適配器來(lái)顯示列表,感興趣的朋友可以研究下2012-12-12Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)
這篇文章主要介紹了Android獲取當(dāng)前位置的經(jīng)緯度數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2016-02-02Android消息推送:手把手教你集成小米推送(附demo)
本篇文章主要介紹了Android消息推送:手把手教你集成小米推送,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2016-12-12Android style的繼承方式 點(diǎn)(.)和parent詳解及實(shí)例
這篇文章主要介紹了Android style的繼承方式 點(diǎn)(.)和parent詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-02-02Android編程實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽(tīng)EditText文本輸入的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)實(shí)時(shí)監(jiān)聽(tīng)EditText文本輸入的方法,結(jié)合實(shí)例形式分析了EditText控件及事件響應(yīng)相關(guān)操作技巧,需要的朋友可以參考下2017-06-06