簡介
SharedPreferences是使用鍵值對的方式來存儲資料的。也就是說當儲存一條資料時,需要給這條資料提供一個對應的鍵,這樣在讀取資料的時候就可以通過這個鍵把相應的值取出來。而且SharedPreferences還支援多種不同的資料類型存儲,如果存儲的資料類型是整型,那麼讀取出來的資料也是整型的,存儲的資料是一個字元串,讀取出來的資料仍然是字元串。
将資料存儲到SharedPreferences中
要想使用SharedPreferences存儲資料,首先需要擷取到SharedPreferences對象。
Android中主要提供了三種方法用于得到SharedPreferences對象。
- Context類中的getSharedPreferences()方法 此方法接收兩個參數:
- 參數1:用于指定SharedPreferences檔案的名稱,如果指定的檔案不存在則會建立一個,SharedPreferences檔案都是存放在/data/data//shared_prefs/目錄下的。
- 參數2:用于指定操作模式,主要有兩種模式可以選擇,MODE_PRIVATE和MODE_MULTI_PROCESS。MODE_PRIVATE仍然是預設的操作模式,和直接傳入0效果是相同的,表示隻有目前的應用程式才可以對這個SharedPreferences檔案進行讀寫。MODE_MULTI_PROCESS則一般是用于會有多個程序中對同一個SharedPreferences檔案進行讀寫的情況。
-
Activity類中的getPreferences()方法
這個方法和Context中的getSharedPreferences()方法很相似,不過它隻接收一個操作模式參數,因為使用這個方法時會自動将目前活動的類名作為SharedPreferences的檔案名。
-
PreferenceManager類中的getDefaultSharedPreferences()方法
這是一個靜态方法,它接收一個Context參數,并自動使用目前應用程式的包名作為字首來命名SharedPreferences檔案。
得到SharedPreferences對象之後,就可以開始向SharedPreferences檔案中存儲資料了,主要可以分為三步實作:
- 調用SharedPreferences對象的edit()方法來擷取一個SharedPreferences.Editor對象。
- 向SharedPreferences.Editor對象中添加資料,比如添加一個布爾型資料就使用putBoolean方法,添加一個字元串則使用putString()方法,以此類推。
- 調用commit()方法将添加的資料送出,進而完成資料存儲操作。
接下來體驗一下SharedPreferences存儲的用法。建立一個Android項目,添加activity_shared_preferences.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_shared_preferences"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="儲存資料" />
</LinearLayout>
添加DataStorageSharedPreferences.java,代碼如下:
public class DataStorageSharedPreferences extends Activity {
private Button mSaveDataButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shared_preferences);
mSaveDataButton = (Button) findViewById(R.id.save_data_shared_preferences);
mSaveDataButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tomcat");
editor.putInt("age", );
editor.putBoolean("married", false);
editor.commit();
}
});
}
}
點選事件中通過getSharedPreferences()方法指定SharedPreferences的檔案名為data,并得到了SharedPreferences.Editor對象。接着向這個對象中添加了三條不同類型的資料,最後調用commit()方法進行送出,進而完成了資料存儲的操作。
運作程式,點選一下“儲存資料”按鈕,這時資料就儲存成功了,不過為了要證明一下,我們還是要借助File Explorer來進行檢視。切換到DDMS視圖,并點選File Explorer切換卡,然後進入到/data/data/com.knittedschool/shared_prefs /data.xml檔案,如下圖所示:
将data.xml檔案導出到電腦上,并打開檢視,如下圖所示:
從SharedPreferences中讀取資料
SharedPreferences對象中提供了一系列的get方法用于對存儲的資料進行讀取,每種get方法都對應了SharedPreferences. Editor中的一種put方法,比如讀取一個布爾型資料就使用getBoolean()方法,讀取一個字元串就使用getString()方法。這些get方法都接收兩個參數,第一個參數是鍵,傳入存儲資料時使用的鍵就可以得到相應的值了,第二個參數是預設值,即表示當傳入的鍵找不到對應的值時,會以什麼樣的預設值進行傳回。
修改activity_shared_preferences.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_shared_preferences"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="儲存資料" />
<Button
android:id="@+id/read_data_shared_preferences"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="讀取資料" />
</LinearLayout>
修改DataStorageSharedPreferences.java中的代碼,如下代碼:
public class DataStorageSharedPreferences extends Activity {
private static final String TAG = "DataStorageSharedPreferences";
private Button mSaveDataButton;
private Button mReadDataButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shared_preferences);
mSaveDataButton = (Button) findViewById(R.id.save_data_shared_preferences);
mSaveDataButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("name", "Tomcat");
editor.putInt("age", );
editor.putBoolean("married", false);
editor.commit();
}
});
mReadDataButton = (Button) findViewById(R.id.read_data_shared_preferences);
mReadDataButton.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", );
boolean married = pref.getBoolean("married", false);
Log.d(TAG, "Name:" + name);
Log.d(TAG, "Age:" + age);
Log.d(TAG, "Married:" + married);
}
});
}
}
可以看到,我們在還原資料按鈕的點選事件中首先通過getSharedPreferences()方法得到了SharedPreferences對象,然後分别調用它的getString()、getInt()和getBoolean()方法去擷取前面所存儲的姓名、年齡、是否已婚,如果沒有找到相應的值就會使用方法中傳入的預設值來代替,最後通過Log将這些值列印出來。
運作程式,并點選界面上的”讀取資料“按鈕,然後檢視LogCat中的列印資訊,如下圖所示: