Android – 資料存取機制 – 偏好設定

在專案運作過程中, 除了專案原始碼加上專案資源檔案編譯為.apk之後, 當使用者在執行app的時候會需要將相關資料進行儲存及使用時, 就將是本章節所要探討的資料儲存存取機制.

有以下幾個主要的面向來進行探討:

  • 使用者的偏好設定
  • 專屬於app的檔案資料
  • 可以共用的檔案資料
  • 存取本機資料庫結構
  • 讀取專案特定資源資料

偏好設定


在應用程式中,通常會將使用者的個人化相關設定進行儲存,以便於下次應用程式啟動時直接使用,這樣的做法讓使用者能夠順暢的操作應用程式,不需每次開啟後還要進行相關設定。例:使用者帳戶、音效開啟狀態、遊戲記錄等。

android.content.SharedPreferences類別提供一個簡易的方式來儲存應用程式的設定值,針對基本類型的key-value成對的名稱資料進行存取機制的架構,利用該類別所構建的物件提供讀取及寫入這些配對的簡單方法,可以存取的基本類型有boolean、float、int、long及字串物件類型的資料。

要使用SharedPreferences來建立新的設定檔案或存取既有的設定檔案,可以呼叫SharedPreferences所提供的兩種方法的其中之一:

  • getSharedPreferences( name , mode ):此方法適用於使用多個偏好設定檔案,根據名稱進行識別,可以從應用程式中的任何 Context 呼叫此方法。使用該方法需傳入兩個參數:
    第一個參數為自定義的儲存檔案名稱,如果指定的名稱不存在,則會在存取同時自動建立儲存檔案。
    第二個參數為指定的操作模式,通常默認為MODE_PRIVATE(0),意思是此資料為私有資料內容, 只能被應用程式本身訪問。
SharedPreferences sharedPref = getSharedPreferences("Key",MODE_PRIVATE);
  • getPreferences():從 Activity 使用此方法來針對使用一個偏好設定檔案,此方法預設偏好設定檔案,因此不需自定義名稱來辨識,只需要傳入指定的操作模式的參數。
SharedPreferences sharedPref = getPreferences(MODE_PRIVATE);

 

若要寫入偏好設定檔案,請呼叫使用SharedPreferences 的類別物件的 edit() 方法,以建立 SharedPreferences.Editor。接著呼叫使用SharedPreferences.Editor物件的putXxx諸如 putInt() 及 putString() 等方法寫入的索引鍵與值,然後呼叫 commit() 以儲存變更。

SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("SharedPreferences","data");
editor.commit();

 

若要取用偏好設定檔案,呼叫使用以建立的SharedPreferences.Editor物件呼叫getXxx諸如 getInt() 與 getString() 等方法,然後提供索引鍵來獲取所想要的值。

String value = sharedPref.getString("SharedPreferences", "defaultValue");

通常在一個專案中, 只需要建立一個SharedPreferences物件實體即可, 而SharedPreferences.Editor物件也一樣, 放在Application物件中的屬性, 而在其所屬的Activity或是Service都可以直接呼叫存取, 而不需要多重的建立物件實體.

先建立一個MainApp類別, 繼承Application. 並宣告兩個私有屬性 SharedPerferences, 及其Editot. 在onCreate()方法中取得兩個物件實體, 假設有三個偏好設定的屬性, 分別是username, stage及sound, 則提供了三個public的方法進行取得資料, 以及三個public的方法來進行寫出.

import android.app.Application;
import android.content.SharedPreferences;

/**
 * Created by brad on 2017/10/14.
 */

public class MainApp extends Application {
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;

    @Override
    public void onCreate() {
        super.onCreate();
        sharedPreferences = getSharedPreferences("game.data", MODE_PRIVATE);
        editor = sharedPreferences.edit();
    }

    public String getUserName(){
        return sharedPreferences.getString("username","guest");
    }
    public int getStage(){
        return sharedPreferences.getInt("stage",0);
    }
    public boolean isPlaySound(){
        return sharedPreferences.getBoolean("sound", true);
    }

    public void setUserName(String username){
        editor.putString("username", username);
        editor.commit();
    }
    public void setStage(int stage){
        editor.putInt("stage", stage);
        editor.commit();
    }
    public void setPlaySound(boolean isPlaySound){
        editor.putBoolean("sound", isPlaySound);
        editor.commit();
    }
}

這樣的處理模式, 必須在AndroidManifest.xml中註記上去.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="tw.brad.ch07_preferencetest">

    <application
        android:name=".MainApp"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

就可以在其所屬的Activity或是Service中進行存取.

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {
    private MainApp mainApp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mainApp = (MainApp)getApplication();

        // 取得資料
        String username = mainApp.getUserName();
        int stage = mainApp.getStage();
        boolean isPlaySound = mainApp.isPlaySound();


        // 更新資料
        mainApp.setUserName("Brad");
        mainApp.setStage(7);
        mainApp.setPlaySound(false);
    }
}

 

 

 

 

%d bloggers like this: