之前,我使用的SharedPreferences的工具类,都是使用静态方法或单例,虽然使用起来还可以,但实用性上还是会有所欠缺。比如这个场景,我们需要将某些相关信息(比如用户信息、设备信息等)单独保存到一个SP文件,在需要时,统一清除掉。
假如不单独保存到一个SP文件,在需要清除某类信息时,就要通过key一个一个删除。如果单独保存,使用单例模式,势必要增加一个工具类。再如果,每个读写方法里都加上文件名参数……
有没有什么方法,只用一个工具类,既可以随时切换到某个SP文件很方便的进行存取,又可以在需要的时候很方便的统一清理某类相关数据(比如用户数据)。
经过苦苦追寻,发现枚举类可以很好的实现上面的需求。下面我就提供一个工具类SPUtil(枚举),只需要一个”.”,选择一下。(SPUtil. (选择)),就可以切换到不同的SP文件,再来一个”.”就可以方便的进行数据存取,轻松又方便,有没有很期待?
来来来,上代码:
/**
*
*(SharedPreferences)工具类----枚举类
* 每个实例对应一个sp文件,如,SYSTEM对应system文件,USER对应user文件…
*
* Update by wangzhengyang on 2017/8/21.
*
* 使用:
*
切换文件写入读取只需要一个“.”
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();
*
*/
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();