1. 程式人生 > >[Android]SharedPreferences資料儲存

[Android]SharedPreferences資料儲存

應用

Android開發中,需要將少量簡單型別的資料儲存在本地,比如幾個字串,一般選擇使用SharedPreferences來儲存。

SharedPreferences:一個輕量級的儲存類,特別適合用於儲存軟體配置引數。使用xml檔案存放資料,檔案存放在/data/data/<package name>/shared_prefs。可以儲存的資料型別有:intbooleanfloatlongStringStringSet。

儲存資料

  • 使用Activity類的getSharedPreferences方法獲得SharedPreferences物件;
  • 使用SharedPreferences介面的edit獲得SharedPreferences.Editor物件;
  • 通過SharedPreferences.Editor介面的putXXX方法儲存key-value對;
  • 通過過SharedPreferences.Editor介面的commit(或apply)方法儲存key-value對。

讀取資料

  • 使用Activity類的getSharedPreferences方法獲得SharedPreferences物件;
  • 通過SharedPreferences物件的getXXX方法獲取資料。 

獲取SharedPreferences物件: 

public SharedPreferences getSharedPreferences (String name, int mode);

name: 自定義命名
mode: 模式
MODE_PRIVATE 只能被自己的應用程式訪問
MODE_WORLD_READABLE 可以被自己的應用程式和其它應用程式讀取
MODE_WORLD_WRITEABLE 可以被自己的應用程式和其它應用程式讀取和寫入

當Activity只需要建立一個SharedPreferences物件時,可以使用getPreferences方法

public SharedPreferences getPreferences (int mode);

獲取Editor物件:

SharedPreferences.Editor edit = mSharedPre.edit( );

 寫入資料:

edit. putXXX ( key , value);

 移除指定key的資料:

edit.remove(key);

 清空資料:

edit.clear();

提交資料:

edit.commit();//或Edit.apply

edit.apply 和 edit.commit區別:

  • apply沒有返回值,commit返回boolean 表明是否提交成功。
  • apply將修改資料原子提交到記憶體,然後非同步提交到硬體磁碟。Commit 是同步提交。前者效率更高。

提交資料:

edit. getXXX ( key , defValue);

SharedPreferences 存取 List

以下封裝了SharedPreferences 儲存、讀取、刪除List集合資料的方法。

public class SharedPreferenceUtil {
    public static final String SHARED_KEY = "shared_key";
    private static int MAX_LIST_SIZE = 10;
    private Context mContext;
    private Activity mActivity;
    SharedPreferences mSharedPreferences;

    public SharedPreferenceUtil(Context mContext, Activity mActivity) {
        this.mContext = mContext;
        this.mActivity = mActivity;
        getCurSharedPreferences();
    }

    private SharedPreferences getCurSharedPreferences() {
        mSharedPreferences = mActivity.getPreferences(mContext.MODE_PRIVATE);
        return mSharedPreferences;
    }

    //移除一條資料
    public void removeItem(String data) {
        //首先獲取已經儲存的list
        ArrayList<String> curList = getStringArrayPreference(SHARED_KEY);
        //從集合中移出data
        curList.remove(data);
        //重新儲存list
        setStringArrayPreference(SHARED_KEY, curList);
    }

    //新儲存一條資料
    public void addItem(String data) {
        int newMaxListSize;
        ArrayList<String> newList = new ArrayList<>();
        newList.add(data);
        ArrayList<String> curList = getStringArrayPreference(SHARED_KEY);
        if (curList.contains(data)) {
            newMaxListSize = MAX_LIST_SIZE;
        } else {
            newMaxListSize = MAX_LIST_SIZE - 1;
        }
        for (int i = 0; i < Math.min(curList.size(), newMaxListSize); i++) {
            if (!data.equals(curList.get(i))) {
                newList.add(curList.get(i));
            }
        }
        setStringArrayPreference(SHARED_KEY, newList);
    }

    //清空所有儲存的資料
    public void clearAllData() {
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        editor.clear();
        editor.apply();
    }

    public void setStringArrayPreference(String key, ArrayList<String> mList) {
        SharedPreferences.Editor editor = mSharedPreferences.edit();
        JSONArray mJSONArray = new JSONArray();
        //將mList的內容存進mJSONArray中
        for (int i = 0; i < mList.size(); i++) {
            mJSONArray.put(mList.get(i));
        }
        //寫入資料
        if (!mList.isEmpty()) {
            editor.putString(key, mJSONArray.toString());
        } else {
            editor.putString(key, null);
        }
        //提交資料
        editor.apply();
    }

    public ArrayList<String> getStringArrayPreference(String key) {
        //讀取儲存的資料
        String json = mSharedPreferences.getString(key, null);
        ArrayList<String> mList = new ArrayList<>();
        if (json != null) {
            try {
                JSONArray mJSONArray = new JSONArray(json);
                //讀取儲存的內容並存進ArrayList陣列中
                for (int i = 0; i < mJSONArray.length(); i++) {
                    String data = mJSONArray.optString(i);
                    mList.add(data);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
        return mList;
    }
}

END.