使用Shared Preferences儲存資料

SharedPreferences類別提供一個通用的框架,讓你可以儲存key-value格式的永久性資料到Android裝置上。你可以使用SharedPreferences存放基本型態的資料,如:布林值(boolean)、浮點數(float)、整數(int)、長整數(long)和字串(String)等等。這些資料在你的程式結束執行時是會被存放下來(即使是該應用程式已經被kill了)。

SharedPreferences儲存資料的方式為Key-Value格式。
要在應用程式當中取得SharedPreferences物件來存取資料,有兩個方式:
  • getSharedPreferences() - 如果你打算分開存放多個檔案資料的話,這個方法可以讓你指定要存放的檔案名稱(透過第一個參數)。
  • getPreferences() - 這個方式只能使用一個檔案來存放資料,因為他無法指定你要存放資料的檔案名稱。

在呼叫getSharedPreferences()需要傳入兩個參數,第一個參數為存放在手機上的檔案名稱,而第二個參數和呼叫getPreferences()方法的第一個參數一樣,皆為該檔案的分享模式。

getSharedPreferences()沒有給第二個參數時,預設模式將為MODE_PRIVATE

分享模式如下:

MODE_PRIVATE該檔案是私有的,其它應用程式都無法存取(預設值)。
MODE_APPEND當該檔案存在時,資料會從後面繼續寫入,否則就建立新檔案。
MODE_WORLD_READABLE裝置內的其它應用程式都可以讀取。
MODE_WORLD_WRITEABLE裝置內的應用程式都可以寫入。
MODE_MULTI_PROCESS為一個旗標,在Android 2.3及以前,該旗標預設為開啟,允許多個行程同時存取同一個SharedPrecferences物件。而之後的Android版本,必須透過明確的將值設定後才能開啟多個行程的存取。
模式也可以混用,例如:
getSharedPreferences("aaronlife", MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE);
為允許其它程式讀取與寫入。

寫入資料:

  1. 呼叫edit()方法來取得SharedPreferences.Editor物件。
  2. 將要寫入的資料透過呼叫方法來存入,如:putString()putInt()
  3. 呼叫commit()來交付資料。

讀出資料

根據要讀回的資料類型使用SharedPreferences物件方法像:getString()getInt()來讀回資料。

範例參考:
public class Calc extends Activity 
{
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state)
    {
        super.onCreate(state);
        . . .
    
        // 恢復preferences資料
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE); 
        boolean silent = settings.getBoolean("silentMode", false);
        setSilent(silent);
    }
    
    @Override
    protected void onStop()
    {
        super.onStop();
    
        // 要改變SharedPreferences裡面資料時都必須透過Editor物件
        SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean("silentMode", mSilentMode);
    
        // Commit the edits!
        editor.commit();
    }
}
SharedPreferences常用方法:
方法名稱描述
boolean contains(String key) 檢查preferences是否包含某個key的值。
SharedPreferences.Editor edit() 建立SharedPreferences.Editor物件讓你可以透過它寫入資料到preferences。
Map getAll() 從preferences中取回所有的資料。
boolean getBoolean(String key, boolean defValue) 從preferences取回布林值
float getFloat(String key, float defValue) 從preferences取回浮點數值
int getInt(String key, int defValue) 從preferences取回整數值
long getLong(String key, long defValue) 從preferences取回長整數值
String getString(String key, String defValue) 從preferences取回字串值
Set getStringSet(String key, Set defValue) 從preferences取回字串Set值
SharedPreferences.Editor常用方法:
方法名稱描述
void apply() 從這個Editore交付你的修改給SharedPreferences物件,該次修改才算生效。
SharedPreferences.Editor clear() 告訴Editor要清除所有preferences內的資料。
boolean commit() 從這個Editore交付你的修改給SharedPreferences物件,該次修改才算生效。
SharedPreferences.Editor putBoolean(String key, boolean value) 加入一個布林值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor putFloat(String key, float value) 加入一個浮點數值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor putInt(String key, int value) 加入一個整數值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor putLong(String key, long value) 加入一個長整數值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor putString(String key, String value) 加入一個字串值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor putStringSet(String key, Set value) 加入一個字串Set值到Editor中;必須呼叫commit()apply()方法後寫入才會生效。
SharedPreferences.Editor remove(String key) 告訴Editor要刪除某個key的資料,必須等到呼叫commit()apply提交資料後該刪除才會生效。

注意

  • 只要修改到SharedPreferences物件內任何資料後都一定要呼叫commit()apply(),該修改才會真正的被更新到SharedPreferences內。
  • SharedPreferences完整方法可以參考Android開發者網站:SharedPreferences
Commit會直接寫入磁碟,而Apply會先緩衝等到適當時機再進行寫入,因此Apply效能較好,但Commit較不容易漏掉資料。