前段时间封装了一个Preference的工具类,每次写项目,都会或多或少的修改一点,渐渐的改成了目前的样子,觉得暂时不会有大的改动了,所以将此分享出来。
为了不与Android中的Preference接口冲突,我定义了一个IPreference接口,并声明了一些基本的方法,如下:
/**
* 保存一个数据
*/
<T> void put(String key, T value);
/**
* 保存一个Map集合
*/
<T> void putAll(Map<String, T> map);
/**
* 保存一个List集合
*/
void putAll(String key, List<String> list);
/**
* 根据key取出一个数据
*/
<T> T get(String key, DataType type);
/**
* 取出全部数据
*/
Map<String, ?> getAll();
/**
* 取出一个List集合
*/
List<String> getAll(String key);
/**
* 移除一个数据
*/
void remove(String key);
/**
* 移除一个集合的数据
*/
void removeAll(List<String> keys);
/**
* 移除一个集合的数据
*/
void removeAll(String[] keys);
/**
* 是否存在key
*/
boolean contains(String key);
/**
* 清除全部数据
*/
void clear();
除了基本的6种数据类型,其中还支持了List集合存储的String数据,当然,由于需要存入Set集合(使用的是TreeSet存储),如果没有提供比较器(Comparator),则使用默认比较器。具体实现如下:
@Override
public void putAll(String key, List<String> list, Comparator<String> comparator) {
Set<String> set = new TreeSet<>(comparator);
for(String value : list){
set.add(value);
}
preferences.edit().putStringSet(key, set).apply();
}
</br>
可以根据key删除一个数据,或一个集合或数组的key(List<String> or String[])。
@Override
public void removeAll(List<String> keys) {
SharedPreferences.Editor edit = preferences.edit();
for (String k : keys) {
edit.remove(k);
}
edit.apply();
}
具体的存储实现是一个私有的方法,实现如下:
/**
* 保存数据
* @param editor
* @param key
* @param obj
*/
@SuppressWarnings("unchecked")
private void put(SharedPreferences.Editor editor, String key, Object obj) {
// key 不为null时再存入,否则不存储
if (key != null){
if (obj instanceof Integer){
editor.putInt(key, (Integer)obj);
} else if (obj instanceof Long){
editor.putLong(key, (Long)obj);
} else if (obj instanceof Boolean){
editor.putBoolean(key, (Boolean)obj);
} else if (obj instanceof Float){
editor.putFloat(key, (Float) obj);
} else if (obj instanceof Set){
editor.putStringSet(key, (Set<String>) obj);
} else if(obj instanceof String) {
editor.putString(key, String.valueOf(obj));
}
}
}
具体取数据的操作如下:
/**
* 根据key和类型取出数据
*/
private Object getValue(String key, DataType type){
switch (type) {
case INTEGER:
return preferences.getInt(key, -1);
case FLOAT:
return preferences.getFloat(key, -1f);
case BOOLEAN:
return preferences.getBoolean(key, false);
case LONG:
return preferences.getLong(key, -1L);
case STRING:
return preferences.getString(key, null);
case STRING_SET:
return preferences.getStringSet(key, null);
default:
return null;
}
}
DataType是一个枚举类,枚举所有的可存取的数据类型
enum DataType {
INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
}
</br>
完整代码
下面是完整的代码:
public interface IPreference {
IPreferenceHolder prefHolder = new IPreferenceHolder();
/**
* IPreference的持有类
*/
class IPreferenceHolder {
/**
* 获得一个新创建的IPreference对象
* @param context 上下文对象
* @param fileName 文件名
* @return
*/
public IPreference newPreference(Context context, String fileName){
return new PreferenceImpl(context, fileName);
}
/**
* 获取一个IPreference对象
* @param context 上下文对象
* @return
*/
public IPreference getPreference(Context context){
return PreferenceImpl.getPreference(context);
}
/**
* 获取一个IPreference对象
* @param context 上下文对象
* @param fileName 文件名
* @return
*/
public IPreference getPreference(Context context, String fileName){
return PreferenceImpl.getPreference(context, fileName);
}
}
/**
* 保存一个数据
* @param key 键
* @param value 值
*/
<T> void put(String key, T value);
/**
* 保存一个Map集合
* @param map
*/
<T> void putAll(Map<String, T> map);
/**
* 保存一个List集合
* @param key
* @param list
*/
void putAll(String key, List<String> list);
/**
* 保存一个List集合,并且自定保存顺序
* @param key
* @param list
* @param comparator
*/
void putAll(String key, List<String> list, Comparator<String> comparator);
/**
* 根据key取出一个数据
* @param key 键
*/
<T> T get(String key, DataType type);
/**
* 取出全部数据
*/
Map<String, ?> getAll();
/**
* 取出一个List集合
* @param key
* @return
*/
List<String> getAll(String key);
/**
* 移除一个数据
* @param key
* @return
*/
void remove(String key);
/**
* 移除一个集合的数据
* @param keys
* @return
*/
void removeAll(List<String> keys);
/**
* 移除一个集合的数据
* @param keys
* @return
*/
void removeAll(String[] keys);
/**
* 是否存在key
* @return
*/
boolean contains(String key);
/**
* 清除全部数据
*/
void clear();
/**
* 获取String类型的数据
* @param key
* @return
*/
String getString(String key);
/**
* 获取Float类型的数据
* @param key
* @return
*/
float getFloat(String key);
/**
* 获取int类型的数据
* @return
*/
int getInteger(String key);
/**
* 获取long类型的数据
* @param key
* @return
*/
long getLong(String key);
/**
* 获取Set类型的数据
* @param key
* @return
*/
Set<String> getSet(String key);
/**
* 获取boolean类型的数据
* @param key
* @return
*/
boolean getBoolean(String key);
/**
* 枚举:存储或取出的数据类型
*/
enum DataType {
INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
}
}
具体的实现类:
PS:这是非public的,不允许外部直接访问。IPreference的实现类对象可通过IPreference中创建的IPreferenceHolder对象获取,也可通过创建IPreferenceHolder对象来获取,如果想扩展,就自己改写吧
/**
* 操作SharedPreferences的工具类
* @author: DINGXIUAN
*/
class PreferenceImpl implements IPreference {
private static IPreference iPreference;
/**
* 对象锁
*/
private static final Object lock = new Object();
/**
* 获取IPreference对象
* @param context
* @return
*/
public static IPreference getPreference(Context context) {
synchronized (lock) {
if (iPreference== null) {
initPreference(context, FILE_NAME);
}
}
return iPreference;
}
/**
* 获取IPreference对象
* @param context
* @param fileName
* @return
*/
public static IPreference getPreference(Context context, String fileName) {
synchronized (lock) {
if (iPreference== null) {
initPreference(context, fileName);
}
}
return iPreference;
}
/**
* 初始化IPreference对象
* @param context
* @param fileName
*/
private static synchronized void initPreference(Context context, String fileName){
if (iPreference== null){
iPreference= new PreferenceImpl(context, fileName);
}
}
/**
* 默认的文件名
*/
private static final String FILE_NAME = "shared_preferences";
private SharedPreferences preferences;
/**
* Instantiates a new Pref manager.
*
* @param context the context
*/
public PreferenceImpl(Context context){
preferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
}
/**
* Instantiates a new Pref manager.
*
* @param context the context
* @param fileName the file name
*/
public PreferenceImpl(Context context, String fileName){
preferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE);
}
@Override
public void put(String key, Object value) {
SharedPreferences.Editor edit = preferences.edit();
put(edit, key, value);
edit.apply();
}
/**
* 保存一个Map集合
* @param map
*/
@Override
public <T> void putAll(Map<String, T> map) {
SharedPreferences.Editor edit = preferences.edit();
for(Map.Entry<String, T> entry : map.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
put(edit, key, value);
}
edit.apply();
}
@Override
public void putAll(String key, List<String> list) {
putAll(key, list, new ComparatorImpl());
}
@Override
public void putAll(String key, List<String> list, Comparator<String> comparator) {
Set<String> set = new TreeSet<>(comparator);
for(String value : list){
set.add(value);
}
preferences.edit().putStringSet(key, set).apply();
}
/**
* 根据key取出一个数据
* @param key 键
*/
@SuppressWarnings("unchecked")
@Override
public <T> T get(String key, DataType type) {
return (T) getValue(key, type);
}
@Override
public Map<String, ?> getAll() {
return preferences.getAll();
}
@Override
public List<String> getAll(String key) {
List<String> list = new ArrayList<String>();
Set<String> set = get(key, DataType.STRING_SET);
for(String value : set){
list.add(value);
}
return list;
}
@Override
public void remove(String key) {
preferences.edit().remove(key).apply();
}
@Override
public void removeAll(List<String> keys) {
SharedPreferences.Editor edit = preferences.edit();
for (String k : keys) {
edit.remove(k);
}
edit.apply();
}
@Override
public void removeAll(String[] keys) {
removeAll(Arrays.asList(keys));
}
@Override
public boolean contains(String key) {
return preferences.contains(key);
}
@Override
public void clear() {
preferences.edit().clear().apply();
}
@Override
public String getString(String key) {
return get(key, DataType.STRING);
}
@Override
public float getFloat(String key) {
return get(key, DataType.FLOAT);
}
@Override
public int getInteger(String key) {
return get(key, INTEGER);
}
@Override
public long getLong(String key) {
return get(key, DataType.LONG);
}
@Override
public Set<String> getSet(String key) {
return get(key, DataType.STRING_SET);
}
@Override
public boolean getBoolean(String key) {
return get(key, DataType.BOOLEAN);
}
/**
* 保存数据
* @param editor
* @param key
* @param obj
*/
@SuppressWarnings("unchecked")
private void put(SharedPreferences.Editor editor, String key, Object obj) {
// key 不为null时再存入,否则不存储
if (key != null){
if (obj instanceof Integer){
editor.putInt(key, (Integer)obj);
} else if (obj instanceof Long){
editor.putLong(key, (Long)obj);
} else if (obj instanceof Boolean){
editor.putBoolean(key, (Boolean)obj);
} else if (obj instanceof Float){
editor.putFloat(key, (Float) obj);
} else if (obj instanceof Set){
editor.putStringSet(key, (Set<String>) obj);
} else if (obj instanceof String){
editor.putString(key, String.valueOf(obj));
}
}
}
/**
* 根据key和类型取出数据
* @param key
* @return
*/
private Object getValue(String key, DataType type){
switch (type) {
case INTEGER:
return preferences.getInt(key, -1);
case FLOAT:
return preferences.getFloat(key, -1f);
case BOOLEAN:
return preferences.getBoolean(key, false);
case LONG:
return preferences.getLong(key, -1L);
case STRING:
return preferences.getString(key, null);
case STRING_SET:
return preferences.getStringSet(key, null);
default: // 默认取出String类型的数据
return null;
}
}
}
比较器:
/**
* 默认比较器,当存储List集合中的String类型数据时,没有指定比较器,就使用默认比较器
*/
public class ComparatorImpl implements Comparator<String> {
@Override
public int compare(String lhs, String rhs) {
return lhs.compareTo(rhs);
}
}