這個系列(「寶寶生活記錄 App」開發日記)從 10 月 5 日起就圍繞著資料庫打轉,資料庫原是為了實作「新增寶寶」與「寶寶列表」這兩個選項而設計的,其實除了資料庫,Android 還提供了其它的儲存機制,今天會介紹偏好設定「SharedPreferences [1]」這個儲存機制,SharedPreferences 顧名思義適合用來儲存使用者的偏好,例如顯示月曆時,通常使用者可以設定每週的第一天是星期一、星期六還是星期天,這種「偏好」就很適合利用 SharedPreferences 來儲存,事實上SharedPreferences 適合用來儲存任何「基本資料型別(以每週的第一天為例,我們可使用整數來儲存)」且只有單筆(多筆資料應該考慮使用資料庫來儲存)的資料。
接下來就用一個簡單的範例來說明 SharedPreferences 的使用:
final String PREF_FILE = "PREF_FILE";
final String PREF_SHOWUSAGE = "PREF_SHOWUSAGE";
final String PREF_STARTUSE = "PREF_STARTUSE";
final String PREF_USERNAME = "PREF_USERNAME";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreferences pref = getSharedPreferences(PREF_FILE, MODE_PRIVATE);
boolean showusage = pref.getBoolean(PREF_SHOWUSAGE, true);
long startuse = pref.getLong(PREF_STARTUSE, 0);
String username = pref.getString(PREF_USERNAME, "");
Log.d("LINCYU", "ShowUsage: " + showusage + ", StartUse: " + startuse +
", Username: " + username);
SharedPreferences.Editor editor = pref.edit();
editor.putBoolean(PREF_SHOWUSAGE, false);
editor.putLong(PREF_STARTUSE,
Calendar.getInstance().getTimeInMillis());
editor.putString(PREF_USERNAME, "Kimi");
editor.commit();
showusage = pref.getBoolean(PREF_SHOWUSAGE, true);
startuse = pref.getLong(PREF_STARTUSE, 0);
username = pref.getString(PREF_USERNAME, "");
Log.d("LINCYU", "ShowUsage: " + showusage + ", StartUse: " + startuse +
", Username: " + username);
}
首先第 11 行,程式先呼叫 Context 類別的 getSharedPreferences 取得 SharedPreferences 物件實體(Activity 是一個 Context 物件),getSharedPreferences需要兩個參數,第一個參數是偏好設定檔的檔案名稱,以本程式為例,此偏好設定檔為 PREF_BIRTH.xml,第二個參數是設定此偏好設定檔的讀取模式,MODE_PRIVATE 代表只允許本應用程式存取這個檔案。
要修改偏好設定檔必須透過一個 SharedPreferences.Editor 物件,因此程式在第 20 行呼叫SharedPreferences 物件的 edit 方法來取得一個 SharedPreferences.Editor 物件,SharedPreferences.Editor提供了不少Methods讓我們儲存資料[2],儲存時是以 Key-Value 的形式來儲存,為了示範,筆者在 21 ~ 24 行分別示範如何寫入布林、長整數和字串,putBoolean, putLong 和 putString 的第一個參數是 Key,Key 是使用一個字串來表示,程式使用了自己定義的字串常數,使用字串常數是個好習慣,之後要取出偏好設定值時,必須使用相同的 Key,如果寫入時使用 “PREF_SHOWUSAGE”,而讀出時使用 “Pref_ShowUsage”,這肯定是讀不到的,且通常這種錯誤要到執行階段才會發現,造成開發時間的浪費,因此強烈建議使用字串常數來當 Key。第二個參數則是 Value,程式分別放入不同資料型態的值。最後我們一定要呼叫SharedPreferences.Editor物件的commit方法,才能將修改寫入偏好設定檔內。
瞭解如何將偏好設定寫入之後,我們接著討論程式如何讀取偏好設定檔,程式 13 ~ 15 行示範了讀取偏好設定的方法,getBoolean, getLong 和 getString 一樣需要兩個參數,第一個參數是 Key,相信讀者都已經了解了,第二個參數是預設值 (Default Value),當找不到相對應的 Key 時,就會使用預設值,第一次執行本程式時,就會使用預設值,但要注意的是,當第二次執行本程式時, 13 ~ 15 行和 27 ~ 29 行的執行結果會是一樣的(只要您沒有清掉偏好設定值),下圖是第一次執行程式的結果(請注意 LogCat 視窗):
另外從上圖我們亦可發現,偏好設定檔 (PREF_FILE.xml) 會儲存在前幾天介紹過的「App 自己的專屬空間」,精確地說是 /data/data/<package name>/shared_prefs 下,我們可嘗試下載這個 XML 檔,其內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<long name="PREF_STARTUSE" value="1411998017620" />
<boolean name="PREF_SHOWUSAGE" value="false" />
<string name="PREF_USERNAME">Kimi</string>
</map>
相信讀者不難了解其內容。至於如何把偏好設定分享給其它 App,可參考筆者的書籍 [3]。
參考資料
[1] SharedPreferences | Android Developers, http://developer.android.com/reference/android/content/SharedPreferences.html
[2] SharedPreferences.Editor | Android Developers, http://developer.android.com/reference/android/content/SharedPreferences.Editor.html
[3] 林致宇, Android程式設計入門與應用(附範例光碟), 全華出版社, ISBN: 9789572194126, http://www.opentech.com.tw/search/bookinfo.asp?isbn=9789572194126&companyID=04383129