Android SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)功能
除了SQLite數(shù)據(jù)庫(kù)外,SharedPreferences也是一種輕型的數(shù)據(jù)存儲(chǔ)方式,不同于文件的存儲(chǔ)方式,SharedPreferences是使用鍵值對(duì)(key-value)數(shù)據(jù)的方式來(lái)存儲(chǔ)數(shù)據(jù)的。而且SharedPreferences還支持多種不同的數(shù)據(jù)類型存儲(chǔ),因此,使用SharedPreferences來(lái)進(jìn)行數(shù)據(jù)持久化要比使用文件方便很多,下面我們就來(lái)看一下它的具體用法吧。
如何將數(shù)據(jù)存儲(chǔ)到SharedPreferences中
要想使用SharedPreferences來(lái)存儲(chǔ)數(shù)據(jù),首先需要獲取到SharedPreferences對(duì)象。Android中主要提供了三種方法用于得到SharedPreferences對(duì)象。
1.Context類中的getSharedPreferences()方法
此方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)用于指定SharedPreferences文件的名稱,如果指定的文件不存在則會(huì)創(chuàng)建一個(gè),SharedPreferences文件都是存放在/data/data//shared_prefs/目錄下的。
第二個(gè)參數(shù)用于指定操作模式,主要有兩種模式可以選擇,MODE_PRIVATE和MODE_MULTI_PROCESS。MODE_PRIVATE仍然是默認(rèn)的操作模式,和直接傳入0效果是相同的,表示只有當(dāng)前的應(yīng)用程序才可以對(duì)這個(gè)SharedPreferences文件進(jìn)行讀寫。MODE_MULTI_PROCESS則一般是用于會(huì)有多個(gè)進(jìn)程中對(duì)同一個(gè)SharedPreferences文件進(jìn)行讀寫的情況。類似地,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE這兩種模式已在Android 4.2版本中被廢棄。
2.Activity類中的getPreferences()方法
這個(gè)方法和Context中的getSharedPreferences()方法很相似,不過它只接收一個(gè)操作模式參數(shù),因?yàn)槭褂眠@個(gè)方法時(shí)會(huì)自動(dòng)將當(dāng)前活動(dòng)的類名作為SharedPreferences的文件名。
3.PreferenceManager類中的getDefaultSharedPreferences()方法
這是一個(gè)靜態(tài)方法,它接收一個(gè)Context參數(shù),并自動(dòng)使用當(dāng)前應(yīng)用程序的包名作為前綴來(lái)命名SharedPreferences文件。
得到了SharedPreferences對(duì)象之后,就可以開始向SharedPreferences文件中存儲(chǔ)數(shù)據(jù)了,主要可以分為三步實(shí)現(xiàn)。
1.調(diào)用SharedPreferences對(duì)象的edit()方法來(lái)獲取一個(gè)SharedPreferences.Editor對(duì)象。
2.向SharedPreferences.Editor對(duì)象中添加數(shù)據(jù),比如添加一個(gè)布爾型數(shù)據(jù)就使用putBoolean方法,添加一個(gè)字符串則使用putString()方法,以此類推。
3.調(diào)用commit()方法將添加的數(shù)據(jù)提交,從而完成數(shù)據(jù)存儲(chǔ)操作。
不知不覺中已經(jīng)將理論知識(shí)介紹得挺多了,那我們就趕快通過一個(gè)例子來(lái)體驗(yàn)一下SharedPreferences存儲(chǔ)的用法吧。
新建一個(gè)SharedPreferencesTest項(xiàng)目,然后修改activity_main.xml中的代碼,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data" /> </LinearLayout>
這里我們只是簡(jiǎn)單地放置了一個(gè)按鈕,用于將一些數(shù)據(jù)存儲(chǔ)到SharedPreferences文件當(dāng)中。
然后修改MainActivity中的代碼,如下所示:
public class MainActivity extends Activity { private Button saveData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); saveData = (Button) findViewById(R.id.save_data); saveData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name", "Lily"); editor.putInt("age", 26); editor.putBoolean("married", false); editor.commit(); } }); } }
可以看到,這里首先給按鈕注冊(cè)了一個(gè)點(diǎn)擊事件,然后在點(diǎn)擊事件中通過getSharedPreferences()方法指定SharedPreferences的文件名為data,并得到了SharedPreferences.Editor對(duì)象。接著向這個(gè)對(duì)象中添加了三條不同類型的數(shù)據(jù),最后調(diào)用commit()方法進(jìn)行提交,從而完成了數(shù)據(jù)存儲(chǔ)的操作。
那么接下來(lái)我們自然要看一看,如何從SharedPreferences文件中去讀取這些數(shù)據(jù)了。
從SharedPreferences中讀取數(shù)據(jù)
SharedPreferences對(duì)象中提供了一系列的get方法用于對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行讀取,每種get方法都對(duì)應(yīng)了SharedPreferences. Editor中的一種put方法,比如讀取一個(gè)布爾型數(shù)據(jù)就使用getBoolean()方法,讀取一個(gè)字符串就使用getString()方法。這些get方法都接收兩個(gè)參數(shù),第一個(gè)參數(shù)是鍵,傳入存儲(chǔ)數(shù)據(jù)時(shí)使用的鍵就可以得到相應(yīng)的值了,第二個(gè)參數(shù)是默認(rèn)值,即表示當(dāng)傳入的鍵找不到對(duì)應(yīng)的值時(shí),會(huì)以什么樣的默認(rèn)值進(jìn)行返回。
我們還是通過例子來(lái)實(shí)際體驗(yàn)一下吧,仍然是在SharedPreferencesTest項(xiàng)目的基礎(chǔ)上繼續(xù)開發(fā),修改activity_main.xml中的代碼,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/save_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Save data" /> <Button android:id="@+id/restore_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Restore data" /> </LinearLayout>
這里增加了一個(gè)還原數(shù)據(jù)的按鈕,我們希望通過點(diǎn)擊這個(gè)按鈕來(lái)從SharedPreferences文件中讀取數(shù)據(jù)。
修改MainActivity中的代碼,如下所示:
public class MainActivity extends Activity { private Button saveData; private Button restoreData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); saveData = (Button) findViewById(R.id.save_data); restoreData = (Button) findViewById(R.id.restore_data); …… restoreData.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE); String name = pref.getString("name", ""); int age = pref.getInt("age", 0); boolean married = pref.getBoolean("married", false); Log.d("MainActivity", "name is " + name); Log.d("MainActivity", "age is " + age); Log.d("MainActivity", "married is " + married); } }); } }
可以看到,我們?cè)谶€原數(shù)據(jù)按鈕的點(diǎn)擊事件中首先通過getSharedPreferences()方法得到了SharedPreferences對(duì)象,然后分別調(diào)用它的getString()、getInt()和getBoolean()方法去獲取前面所存儲(chǔ)的姓名、年齡和是否已婚,如果沒有找到相應(yīng)的值就會(huì)使用方法中傳入的默認(rèn)值來(lái)代替,最后通過Log將這些值打印出來(lái)。
通過這個(gè)簡(jiǎn)單的例子,我們就了解了如何利用SharedPreferences實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)。相比之下,SharedPreferences存儲(chǔ)確實(shí)要比文本存儲(chǔ)簡(jiǎn)單方便了許多,應(yīng)用場(chǎng)景也多了不少,比如很多應(yīng)用程序中的偏好設(shè)置功能其實(shí)都使用到了SharedPreferences技術(shù)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android?studio數(shù)據(jù)存儲(chǔ)建立SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)增刪查改
- Android 通過SQLite數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)管理
- Android四種數(shù)據(jù)存儲(chǔ)的應(yīng)用方式
- Android基礎(chǔ)教程數(shù)據(jù)存儲(chǔ)之文件存儲(chǔ)
- android使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)
- Android開發(fā)教程之ContentProvider數(shù)據(jù)存儲(chǔ)
- 詳解Android的網(wǎng)絡(luò)數(shù)據(jù)存儲(chǔ)
- 5種Android數(shù)據(jù)存儲(chǔ)方式匯總
- 詳解Android數(shù)據(jù)存儲(chǔ)之SQLCipher數(shù)據(jù)庫(kù)加密
- Android 單例模式實(shí)現(xiàn)可復(fù)用數(shù)據(jù)存儲(chǔ)的詳細(xì)過程
相關(guān)文章
Android編程之桌面小部件AppWidgetProvider用法示例
這篇文章主要介紹了Android編程之桌面小部件AppWidgetProvider用法,結(jié)合具體實(shí)例形式分析了Android桌面組件AppWidgetProvider的功能、布局、權(quán)限設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08Android 中實(shí)現(xiàn)ListView滑動(dòng)隱藏標(biāo)題欄的代碼
本文通過實(shí)例代碼給大家分享了android listview滑動(dòng)隱藏標(biāo)題欄的方法,代碼簡(jiǎn)單易懂,需要的朋友參考下2017-01-01Android編程實(shí)現(xiàn)抽屜效果的方法示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)抽屜效果的方法,結(jié)合具體實(shí)例形式分析了Android抽屜效果的布局、功能實(shí)現(xiàn)及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-06-06音量控制鍵控制的音頻流(setVolumeControlStream)描述
當(dāng)開發(fā)多媒體應(yīng)用或者游戲應(yīng)用的時(shí)候,需要使用音量控制鍵來(lái)設(shè)置程序的音量大小,在Android系統(tǒng)中有多種音頻流,感興趣的朋友可以了解下2013-01-01Android透明化和沉浸式狀態(tài)欄實(shí)踐及源碼分析
這篇文章主要介紹了Android透明化和沉浸式狀態(tài)欄實(shí)踐及源碼分析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03在ubuntu下編譯ijkplayer-android的方法
下面小編就為大家分享一篇在ubuntu下編譯ijkplayer-android的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-01-01Android 中出現(xiàn)java.net.BindException: bind failed: EADDRINUSE 問
這篇文章主要介紹了Android 中出現(xiàn)java.net.BindException: bind failed: EADDRINUSE 問題解決辦法的相關(guān)資料,需要的朋友可以參考下2017-04-04Android網(wǎng)絡(luò)訪問之Retrofit使用教程
Retrofit?是一個(gè)?RESTful?的?HTTP?網(wǎng)絡(luò)請(qǐng)求框架的封裝,網(wǎng)絡(luò)請(qǐng)求的工作本質(zhì)上是?OkHttp?完成,而?Retrofit?僅負(fù)責(zé)?網(wǎng)絡(luò)請(qǐng)求接口的封裝2022-12-12