一个关于SharedPreferences的工具类

简介

      之前,我使用的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();

猜你喜欢

转载自blog.csdn.net/wangxiaocheng16/article/details/78626099