不一樣於文件的存儲方式,SharedPreferences 是使用鍵值對的方式來存儲數據的。也就是 說當保存一條數據的時候,須要給這條數據提供一個對應的鍵,這樣在讀取數據的時候就可 以經過這個鍵把相應的值取出來。並且 SharedPreferences 還支持多種不一樣的數據類型存儲, 若是存儲的數據類型是整型,那麼讀取出來的數據也是整型的,存儲的數據是一個字符串, 讀取出來的數據仍然是字符串。android
這樣你應該就能明顯地感受到,使用 SharedPreferences 來進行數據持久化要比使用文件方便不少,下面咱們就來看一下它的具體用法吧。ide
6.3.1 將數據存儲到 SharedPreferences 中學習
要想使用 SharedPreferences 來存儲數據,首先須要獲取到 SharedPreferences 對象。Androidrest
中主要提供了三種方法用於獲得 SharedPreferences 對象。xml
1. Context 類中的 getSharedPreferences()方法 此方法接收兩個參數,第一個參數用於指定 SharedPreferences 文件的名稱,若是指對象
定的文件不存在則會建立一個,SharedPreferences 文件都是存放在/data/data/<package name>/shared_prefs/目錄下的。第二個參數用於指定操做模式,主要有兩種模式能夠選 擇,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默認的操 做模式,和直接傳入 0 效果是相同的,表示只有當前的應用程序才能夠對這個 SharedPreferences 文件進行讀寫。MODE_MULTI_PROCESS 則通常是用於會有多個進程中 對同一個 SharedPreferences 文件進行讀寫的狀況。相似地,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 這兩種模式已在 Android 4.2 版本中被廢棄。blog
2. Activity 類中的 getPreferences()方法進程
這個方法和 Context 中的 getSharedPreferences()方法很類似,不過它只接收一個操 做模式參數,由於使用這個方法時會自動將當前活動的類名做爲 SharedPreferences 的文 件名。事件
3. PreferenceManager 類中的 getDefaultSharedPreferences()方法 這是一個靜態方法,它接收一個 Context 參數,並自動使用當前應用程序的包名做開發
爲前綴來命名 SharedPreferences 文件。
獲得了 SharedPreferences 對象以後,就能夠開始向 SharedPreferences 文件中存儲數據了, 主要能夠分爲三步實現。
1. 調用 SharedPreferences 對象的 edit()方法來獲取一個 SharedPreferences.Editor 對象。
2. 向 SharedPreferences.Editor 對象中添加數據,好比添加一個布爾型數據就使用
putBoolean 方法,添加一個字符串則使用 putString()方法,以此類推。
3. 調用 commit()方法將添加的數據提交,從而完成數據存儲操做。 不知不覺中已經將理論知識介紹得挺多了,那咱們就趕快經過一個例子來體驗一下
SharedPreferences 存儲的用法吧。新建一個 SharedPreferencesTest 項目,而後修改 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>
這裏咱們不作任何複雜的功能,只是簡單地放置了一個按鈕,用於將一些數據存儲到
SharedPreferences 文件當中。而後修改 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", "Tom"); editor.putInt("age", 28); editor.putBoolean("married", false);
editor.commit();
}
});
}
}
可 以 看 到 , 這 裏 首 先 給 按 鈕 注 冊 了 一 個 點 擊 事 件 , 然 後 在 點 擊 事 件 中 通 過 getSharedPreferences()方法指定 SharedPreferences 的文件名爲 data,並獲得了 SharedPreferences.Editor 對象。接着向這個對象中添加了三條不一樣類型的數據,最後調用 commit()方法進行提交,從 而完成了數據存儲的操做。
很簡單吧?如今就能夠運行一下程序了,進入程序的主界面後,點擊一下 Save data 按鈕。這時的數據應該已經保存成功了,不過爲了要證明一下,咱們仍是要藉助 File Explorer 來進行查看。切換到 DDMS 視圖,並點擊 File Explorer 切換卡,而後進入到/data/data/com. example.sharedpreferencestest/shared_prefs /目錄下,能夠看到生成了一個 data.xml 文件,如圖 6.6 所示。
圖 6.6
接下來一樣是點擊導出按鈕將這個文件導出到電腦上,並用記事本進行查看,裏面的內 容如圖 6.7 所示。
圖 6.7
能夠看到,咱們剛剛在按鈕的點擊事件中添加的全部數據都已經成功保存下來了,而且SharedPreferences 文件是使用 XML 格式來對數據進行管理的。 那麼接下來咱們天然要看一看,如何從 SharedPreferences 文件中去讀取這些數據了。
從 SharedPreferences 中讀取數據
你應該已經感受到了,使用 SharedPreferences 來存儲數據是很是簡單的,不過下面還有 更好的消息,其實從 SharedPreferences 文件中讀取數據更加的簡單。SharedPreferences 對象 中提供了一系列的get 方法用於對存儲的數據進行讀取,每種get 方法都對應了SharedPreferences. Editor 中的一種 put 方法,好比讀取一個布爾型數據就使用 getBoolean()方法,讀取一個字符 串就使用 getString()方法。這些 get 方法都接收兩個參數,第一個參數是鍵,傳入存儲數據 時使用的鍵就能夠獲得相應的值了,第二個參數是默認值,即表示當傳入的鍵找不到對應的 值時,會以什麼樣的默認值進行返回。
咱們仍是經過例子來實際體驗一下吧,仍然是在 SharedPreferencesTest 項目的基礎上繼 續開發,修改 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>
這裏增長了一個還原數據的按鈕,咱們但願經過點擊這個按鈕來從 SharedPreferences 文 件中讀取數據。修改 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);
});
}
}
能夠看到,咱們在還原數據按鈕的點擊事件中首先經過 getSharedPreferences()方法獲得 了 SharedPreferences 對象,而後分別調用它的 getString()、getInt()和 getBoolean()方法去獲取 前面所存儲的姓名、年齡和是否已婚,若是沒有找到相應的值就會使用方法中傳入的默認值 來代替,最後經過 Log 將這些值打印出來。
如今從新運行一下程序,並點擊界面上的 Restore data 按鈕,而後查看 LogCat 中的打印 信息,如圖 6.8 所示。
圖 6.8
全部以前存儲的數據都成功讀取出來了!經過這個例子,咱們就把 SharedPreferences 存儲的知識也學習完了。相比之下,SharedPreferences 存儲確實要比文本存儲簡單方便了許多, 應用場景也多了很多,好比不少應用程序中的偏好設置功能其實都使用到了 SharedPreferences 技術。