使用SharedPreferences存取設定資料

By | 2017-06-27

在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中寫入資料的片段程式碼如下:

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

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

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

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

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

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

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

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

讀取設定檔內的資料

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

第1行,先取得SharedPreferences物件。

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

手機內部儲存方式

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

 

相關文章:

One thought on “使用SharedPreferences存取設定資料

  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));

    無論順序,第二行就是會報錯

    Reply

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *