安卓中使用SharedPreferences保存javaBean类对象

来源:互联网 发布:希捷数据恢复要多少钱 编辑:程序博客网 时间:2024/06/05 19:14

安卓中保存文件的方法有多种多样的,现在说的一种就是在开发中经常用到的SharedPreferences。相信接触过一段时间安卓开发的朋友都会使用基本用法。(就算不会用,百度一下也有很多普通的用法教程)。

SharedPreferences保存数据是以键值对的方式存储Key = value;的形式。会发现有一系列的put重载方法,能存入的全是基本数据类型的value值,获取的话也是一系列的get重载方法获取value值。

那么问题来了,如果我想在value中存一个java类对象该怎么办呢?根据系统提供的API是不能存储的。

解决这个问题也就是把java类序列化以流的方式存储进去。

下面直接上代码:

public static <T> 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 extends Object> 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");

取出时调用上面这个方法即可。

如有错误或遗漏,欢迎提出讨论。