天天看點

Android開發筆記——SharedPreferences 存儲實體類以及任意類型

日常開發中我們常常要用到儲存資料,Android中常用的存儲方式有SQLite,sharedPreferences 等,當然也有各自的應用場景,前者适用于儲存較多資料的情形,後者責傾向于儲存使用者偏好設定比如某個checkbox的選擇狀态,使用者登入的狀态等等,都是以鍵值對的形式進行的檔案讀取,可以存儲String,int,booean等一些基本資料類型等等。

但是每存儲一個資料都要提供一個key,如果要存儲多個資料那豈不是要寫多個key?例如我們要儲存一個使用者的登入資訊,比如使用者昵稱,個性簽名,登入時間………尼瑪我一條資料寫一個的話我都可以玩一盤撸啊撸了~反正我是受不了~那麼我們能否将使用者資訊封裝起來,統一以一個key來儲存呢?答案是肯定可以的~

java類庫中提供的位元組輸入輸出流可以輕松幫我們完成任意類型到String的可逆轉換,繼而我們就可以儲存到Share中了~

下面看代碼:

/**
     * 存放實體類以及任意類型
     * @param context 上下文對象
     * @param key 
     * @param obj
     */
    public static void putBean(Context context, String key, Object obj) {
        if (obj instanceof Serializable) {// obj必須實作Serializable接口,否則會出問題
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(obj);
                String string64 = new String(Base64.encode(baos.toByteArray(),
                        ));
                Editor editor = getSharedPreferences(context).edit();
                editor.putString(key, string64).commit();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            throw new IllegalArgumentException(
                    "the obj must implement Serializble");
        }

    }

    public static Object getBean(Context context, String key) {
        Object obj = null;
        try {
            String base64 = getSharedPreferences(context).getString(key, "");
            if (base64.equals("")) {
                return null;
            }
            byte[] base64Bytes = Base64.decode(base64.getBytes(), );
            ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            obj = ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;


           

我在公司的項目中解析json資料使用了fastJson,是通過映射關系來解析json并且可以直接将json和實體類封裝好,我稍微看了一下,fastjson也可以幫我們實作對實體類的儲存,下面看以下方法:

public static void seveBeanByFastJson(Context context, String key,
            Object obj) {
        Editor editor = getSharedPreferences(context).edit();
        String objString = JSON.toJSONString(obj);// fastjson的方法,需要導包的
        editor.putString(key, objString).commit();
    }

    /**
     * 
     * @param context
     * @param key
     * @param clazz
     *            這裡傳入一個類就是我們所需要的實體類(obj)
     * @return 傳回我們封裝好的該實體類(obj)
     */
    public static <T> T getBeanByFastJson(Context context, String key,
            Class<T> clazz) {
        String objString = getSharedPreferences(context).getString(key, "");
        return JSON.parseObject(objString, clazz);
    }
           

如果項目中導入了fastjson,可以亦可以使用上述方法儲存實體類以及任意類型~:

下面我們來測試一下:

我随意寫個實體類,并加個測試方法:

import java.io.Serializable;

public class Human implements Serializable {

    /**
     * 人實體類
     */
    private static final long serialVersionUID = L;

    private String name;

    private int age;

    private boolean isMarried;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public boolean isMarried() {
        return isMarried;
    }

    public void setMarried(boolean isMarried) {
        this.isMarried = isMarried;
    }

}
           

随便寫個測試方法,簡便起見哈~

private Human initDataBean() {
        Human human = new Human();
        human.setAge();
        human.setName("蘿莉");
        human.setMarried(false);
        return human;
    }

    private Human initDataBean2() {
        Human human = new Human();
        human.setAge();
        human.setName("禦姐");
        human.setMarried(true);
        return human;
    }
           

下面我們來看看測試效果~:

Android開發筆記——SharedPreferences 存儲實體類以及任意類型

總結,上述兩種方法都可以幫我們存儲和讀取任意類型的資料,與SharePreferencs結合起來使用還是很友善的,但是不要存儲bimap等這一類比較大的資料類型,因為share其實本質也是讀檔案,大檔案比較耗時,肯定會影響系統性能,如果我們要儲存圖檔,就存個url的字段就好了~

demo源碼下載下傳