android: SharedPreferences儲存

yufan發表於2016-03-03

不同於檔案的儲存方式,SharedPreferences 是使用鍵值對的方式來儲存資料的。也就是 說當儲存一條資料的時候,需要給這條資料提供一個對應的鍵,這樣在讀取資料的時候就可 以通過這個鍵把相應的值取出來。而且 SharedPreferences 還支援多種不同的資料型別儲存, 如果儲存的資料型別是整型,那麼讀取出來的資料也是整型的,儲存的資料是一個字串, 讀取出來的資料仍然是字串。

這樣你應該就能明顯地感覺到,使用 SharedPreferences 來進行資料持久化要比使用檔案方便很多,下面我們就來看一下它的具體用法吧。

 

6.3.1    將資料儲存到 SharedPreferences 中

要想使用 SharedPreferences 來儲存資料,首先需要獲取到 SharedPreferences 物件。Android

中主要提供了三種方法用於得到 SharedPreferences 物件。

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 版本中被廢棄。

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 技術。

相關文章