使用SharedPreferences存取設定資料

在Android中設計應用程式時,若想要儲存簡單資料,可使用android.content.SharedPreferences類別,儲存如帳號、設定、上一次登入時間、遊戲關卡或電子郵件等,好讓APP在下一次執行時可讀取到這些上一次儲存下來的資料。資料的儲存格式是XML檔,儲存在Android手機中每個APP都會擁有的一個專用目錄下。

偏好設定SharedPreferences

SharedPreferences是Android的一個介面,可在Activity中呼叫getSharedPreferences(String, int)方法得到物件。

參數:檔案名稱String|

第一個參數是定義此設定檔的檔名,不需要指定副檔名,如”atm”即寫入到atm.xml。

參數:存取權限int

設定這個設定檔的存取權限,有四種選擇 (0,1,2,4),我們不需要背這些值,使用Activity中已定義的常數MODE_XXX即可。在設計時鍵入大寫M後可快速選擇這些參數,如下圖:

參數的值與其說明如下:

  • MODE_PRIVATE

只允許本應用程式內存取,這是最常用參數。

  • MODE_MULTI_PROCESS

允許多個行程同時存取這個設定檔,這個設定在Android 2.3(含)以前都是預設啟用的,但2.3之後得要指定這個參數才允許多行程同時存取設定檔。

  • MODE_WORLD_READABLE

讓手機中的所有app都能讀取這個設定檔,因為風險性太高,從API 17版開始就不建議使用這個參數了。

  • MODE_WORLD_WRITEABLE

讓手機中的所有app都能存取、寫入這個設定檔,已經不建議使用了,原因與上一個參數相同。

寫入資料

寫資料時應使用SharedPreferences.Editor這個編輯器介面,可由edit()方法取得Editor物件,在Activity中寫入資料的片段程式碼如下:

        String user = "jack";
        SharedPreferences pref = getSharedPreferences("test", MODE_PRIVATE);
        pref.edit()
                .putString("USER", user)
                .commit();

第1行是將被寫入的字串user,內容為jack。

第2行,呼叫getSharedPreferences()方法,產生一個檔名為test.xml的設定儲存檔,並只供本專案(app)可讀取,物件名稱為pref。

第3-4行,呼叫edit()方法取得編輯器物件,此時使用匿名方式呼叫Editor的putString()方法將user字串的內容寫入設定檔,資料標籤為”USER”。

第5行,最後必須呼叫commit()方法,此時資料才真正寫入到設定檔中。

如果有多筆資料要寫入設定檔時,先put資料後,最後再呼叫commit()方法一次寫入,可減少寫入的次數,可兼顧SD卡的效能與降低耗損,如下片段程式:

         pref.edit()
                 .putString("USER", user)
                 .putInt("STAGE", 3)
                 .putFloat("HP", (float) 98.3)
                 .commit();

第1行,呼叫edit()方法取得Editor物件。

第2-4行開始新增三筆資料,分別為字串、整數與浮點數。

第5行,最後才將三筆資料寫入設定檔。

讀取設定檔內的資料

使用SharedPreferences的方法getXX方法讀取先前已寫入的設定值,getString方法為讀取字串設定值,使用getInt方法讀取整數設定值,以此類推,還有getBoolean、getFloat、getLong與getStringSet等方法可取得對應資料型態的設定值。利用getSharedPreferences()方法先取得物件後,再讀取所需的設定值,如下程式片段:

            String userid = getSharedPreferences("test", MODE_PRIVATE)
                    .getString("USER", "");

第1行,先取得SharedPreferences物件。

第2行,取得標籤”USER”的設定值,getString方法的第二個參數是預設值(default),當讀取不到或設定檔內無該設定值時,會傳回這個預設值,本例預設是空字串。

手機內部儲存方式

本節雖然介紹了在程式設計時如何寫入與讀取設定值,但在開發實務過程中,往往需要在除錯時能夠遠端連接至手機或模擬器中,以便進行檢視或手動更改設定值。因此在下一節,筆者將介紹如何使用Android SDK的除錯工具「adb」,登入設備中並檢視設定檔的內容。

 

6 Comments

  1. Matt

    為什麼這樣
    pref.edit()
    .putString(“USER”, user)
    .putInt(“STAGE”, 3)
    .putFloat(“HP”, (float) 98.3)
    .commit();
    沒有問題,但是
    new TextView(this)
    .setText(“empty”)
    .setGravity(Gravity.CENTER) —————————->這行會報錯
    .setHeight(dp_to_px(60))
    .setWidth(dp_to_px(60));
    無論順序,第二行就是會報錯

  2. 訪客

    請問如何在Adapter裡面使用getSharedPreferences()

  3. MME

    設定SharedPreferences儲存後,讀取的資料一直是空值……同時找不到原因
    想請問看看有是不是語法有什麼錯誤…..
    登入頁面
    s_id =(EditText)findViewById(R.id.number);
    final String str = s_id.getText().toString();//str抓取EditText的資料
    SharedPreferences pref = getSharedPreferences(“test”, MODE_PRIVATE);
    pref.edit()
    .putString(“USER”, str)
    .commit();
    ……………………………………………………………………………………………………………………………………………………………………………………
    //再新頁面,取用 getSharedPreferences的儲存內容
    final String userid = getSharedPreferences(“test”, MODE_PRIVATE)
    .getString(“USER”, “”);
    Log.v(“log_tag=”,userid);
    SAV=(TextView)findViewById(R.id.SAVE);
    SAV.setText(userid);
    //實際測試Log沒有抓到資料,但另開簡單的新專案測試是有抓到值的,SharedPreferences語法用一樣
    id命名也有確認…..然而原專案卻沒法向新專案一樣抓取到資料
    登入頁面完整
    http://notes.io/91Vh
    Post傳值完整
    http://notes.io/91Vk
    不好意思反覆試一直沒成功 所以來這求助….

  4. MME

    對不起,原因弄明白了,原來是資料庫換了ip位置不好意思打掃了

發佈回覆給「Matt」的留言 取消回覆

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *