一个关于SharedPreferences的工具类

来源:互联网 发布:尚学堂 java视频 编辑:程序博客网 时间:2024/06/03 23:45

简介

      之前,我使用的SharedPreferences的工具类,都是使用静态方法或单例,虽然使用起来还可以,但实用性上还是会有所欠缺。比如这个场景,我们需要将某些相关信息(比如用户信息、设备信息等)单独保存到一个SP文件,在需要时,统一清除掉。

      假如不单独保存到一个SP文件,在需要清除某类信息时,就要通过key一个一个删除。如果单独保存,使用单例模式,势必要增加一个工具类。再如果,每个读写方法里都加上文件名参数……

      有没有什么方法,只用一个工具类,既可以随时切换到某个SP文件很方便的进行存取,又可以在需要的时候很方便的统一清理某类相关数据(比如用户数据)。

      经过苦苦追寻,发现枚举类可以很好的实现上面的需求。下面我就提供一个工具类SPUtil(枚举),只需要一个”.”,选择一下。(SPUtil. (选择)),就可以切换到不同的SP文件,再来一个”.”就可以方便的进行数据存取,轻松又方便,有没有很期待?

code

      来来来,上代码:

/** * *(SharedPreferences)工具类----枚举类 * 每个实例对应一个sp文件,如,SYSTEM对应system文件,USER对应user文件… * * Update by wangzhengyang on 2017/8/21. * * 使用: * <code> 切换文件写入读取只需要一个“.” SPUtil.SYSTEM.……  //切换到system文件读写 SPUtil.USER.……   //切换到user文件读写 //单个写入提交 SPUtil.USER.putInt("age", 32).commit(); //链式调度写入提交(Consts:一个保存常量的类) SPUtil.USER .putString(Consts.KEY_NAME, "张三") .putString(Consts.KEY_SEX, "男") .putInt(Consts.KEY_AGE, 23) .commit(); //读取 String name = SPUtil.USER.getString(Consts.KEY_NAME, ""); String sex = SPUtil.USER.getString(Consts.KEY_SEX, ""); int age = SPUtil.USER.getInt(Consts.KEY_AGE, 0); Log.i(TAG, "name: " + name + "\tsex: "+ sex + "\tage: " + age); //根据key移除 boolean isRemoved = SPUtil.USER.remove(Consts.USER_NAME); //清除所有 boolean isClear = SPUtil.USER.clear(); </code> * */public enum SPUtil {    DEFAULT("default"),    SYSTEM("system"),    DEVICE("device"),    USER("user");    private final SharedPreferences SHARED_PREFS;    private final String FILE_NAME;    private final SharedPreferences.Editor EDITOR;    SPUtil(String fileName) {        this.FILE_NAME = fileName;        SHARED_PREFS = MyApplication.getAppContext().getSharedPreferences(this.FILE_NAME, Context.MODE_PRIVATE);        EDITOR = SHARED_PREFS.edit();    }    /**     * 获得文件名     * @return 文件名     */    public String getFileName(){        return FILE_NAME;    }    public SPUtil putString(String key, String value) {        //if (TextUtils.isEmpty(key)) return false;        EDITOR.putString(key, value);        return this;    }    public String getString(String key, String defValue) {        //if (TextUtils.isEmpty(key)) return null;        return SHARED_PREFS.getString(key, defValue);    }    public SPUtil putBoolean(String key, boolean value) {        //if (TextUtils.isEmpty(key)) return false;        EDITOR.putBoolean(key, value);        return this;    }    public boolean getBoolean(String key, boolean defValue) {        //if (TextUtils.isEmpty(key)) return false;        return SHARED_PREFS.getBoolean(key, defValue);    }    public SPUtil putInt(String key, int value) {        EDITOR.putInt(key, value);        return this;    }    public int getInt(String key, int defValue) {        return SHARED_PREFS.getInt(key, defValue);    }    public SPUtil putFloat(String key, float value) {        EDITOR.putFloat(key, value);        return this;    }    public float getFloat(String key, float defValue) {        return SHARED_PREFS.getFloat(key, defValue);    }    public SPUtil putLong(String key, long value) {        EDITOR.putLong(key, value);        return this;    }    public long getLong(String key, long defValue) {        return SHARED_PREFS.getLong(key, defValue);    }    /**     * 根据key移除     * @param key     * @return     */    public boolean remove(String key){        return EDITOR.remove(key).commit();    }    /**     * 清除SP文件中的所有数据     * @return     */    public boolean clear(){        return EDITOR.clear().commit();    }    /**     * 提交     * @return     */    public boolean commit(){        return EDITOR.commit();    }}

我自己的体验

用起来相当的方便!

1. 切换文件只需要一个“.”

SPUtil.SYSTEM.……  //切换到system文件读写SPUtil.USER.……   //切换到user文件读写

2. 单个写入,链式批量写入都可以(需要提交哦!)

//单个写入提交 SPUtil.USER.putInt("age", 32).commit(); //链式调度写入提交(Consts:一个保存常量的类) SPUtil.USER .putString(Consts.KEY_NAME, "张三") .putString(Consts.KEY_SEX, "男") .putInt(Consts.KEY_AGE, 23) .commit();

3. 读写数据不需要传入context(已经用了全局的Context)

只需要修改构造方法中的全局Context(MyApplication.getAppContext())为自己的全局Context。

//读取 String name = SPUtil.USER.getString(Consts.KEY_NAME, ""); String sex = SPUtil.USER.getString(Consts.KEY_SEX, ""); int age = SPUtil.USER.getInt(Consts.KEY_AGE, 0); Log.i(TAG, "name: " + name + "\tsex: "+ sex + "\tage: " + age);

3. 只需要切换到相应的文件下,就可以轻松移除。

 //根据key移除 boolean isRemoved = SPUtil.USER.remove(Consts.USER_NAME); //清除所有 boolean isClear = SPUtil.USER.clear();
原创粉丝点击