安卓中使用SharedPreferences保存javaBeanlei對象

安卓中使用SharedPreferences保存javaBeanlei對象,安卓中保存文件的方法有多種多樣的,現在說的一種就是在開發中經常用到的SharedPreferences。相信接觸過一段時間安卓開發的朋友都會使用基本用法。(就算不會用,百度一下也有很多普通的用法教程)。

SharedPreferences保存數據是以鍵值對的方式存儲Key = value;的形式。會發現有一系列的put重載方法,能存入的全是基本數據類型的value值,獲取的話也是一系列的get重載方法獲取value值。

那麼問題來瞭,如果我想在value中存一個java類對象該怎麼辦呢?根據系統提供的API是不能存儲的。

解決這個問題也就是把java類序列化以流的方式存儲進去。

下面直接上代碼:

public static  void saveBean2Sp(Context context, T t, String fileName, String keyName) {
        SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        ByteArrayOutputStream bos;
        ObjectOutputStream oos = null;
        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(t);
            byte[] bytes = bos.toByteArray();
            String ObjStr = Base64.encodeToString(bytes, Base64.DEFAULT);
            SharedPreferences.Editor editor = preferences.edit();
            editor.putString(keyName, ObjStr);
            editor.commit();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (oos != null) {
                try {
                    oos.flush();
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

上面這個靜態的方法就是把java類存入SharedPreferences中,第一個參數上下文對象,第二個參數需要保存的實體類,第三個參數保存的文件的名稱,第四個參數鍵值。
註意:一定要在finally中把流關閉,因為流是非常耗費資源的。

public static  T getBeanFromSp(Context context, String fileName, String keyNme) {
        SharedPreferences preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
        byte[] bytes = Base64.decode(preferences.getString(keyNme, ""), Base64.DEFAULT);
        ByteArrayInputStream bis;
        ObjectInputStream ois = null;
        T obj = null;
        try {
            bis = new ByteArrayInputStream(bytes);
            ois = new ObjectInputStream(bis);
            obj = (T) ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if (ois != null) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return obj;
    }

這個方法就是獲取java類對象的方法,隻需要調用時第四個參數以存入時的鍵值就能獲取到存入的對象。

實體類:

public class LoginModelBean implements Serializable{
    @SerializedName("loginTime")
    private String loginTime;
    @SerializedName("IP")
    private String IP;
    @SerializedName("id")
    private int id;
    @SerializedName("userId")
    private int userId;
    @SerializedName("token")
    private String token;

    public String getLoginTime() {
        return loginTime;
    }

    public void setLoginTime(String loginTime) {
        this.loginTime = loginTime;
    }

    public String getIP() {
        return IP;
    }

    public void setIP(String IP) {
        this.IP = IP;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

這裡要註意:實體類一定要實現Serializable序列化接口不然會報IOException異常(這裡是最容易忘記的,最好第一步就實現Serializable接口)

LoginModelBean loginModelBean = new LoginModelBean();
loginModelBean.setId(response.body().getResult().getId());
loginModelBean.setIP(response.body().getResult().getIP());
loginModelBean.setLoginTime(response.body().getResult().getLoginTime());
loginModelBean.setToken(response.body().getResult().getToken());
loginModelBean.setUserId(response.body().getResult().getUserId());
SPUtils.saveBean2Sp(mContext, loginModelBean,"loginData","loginModelBean");

這裡創建一個實體類把數據封裝好然後調用saveBean2Sp()方法把數據傳進去就行瞭。

SPUtils.getBeanFromSp(mContext, "loginData", "loginModelBean");

取出時調用上面這個方法即可。

如有錯誤或遺漏,歡迎提出討論。

You May Also Like