前段時(shí)間封裝了一個(gè)Preference的工具類秀菱,每次寫項(xiàng)目柿菩,都會(huì)或多或少的修改一點(diǎn)戚嗅,漸漸的改成了目前的樣子,覺得暫時(shí)不會(huì)有大的改動(dòng)了枢舶,所以將此分享出來懦胞。
為了不與Android中的Preference接口沖突,我定義了一個(gè)IPreference接口凉泄,并聲明了一些基本的方法躏尉,如下:
/**
* 保存一個(gè)數(shù)據(jù)
*/
<T> void put(String key, T value);
/**
* 保存一個(gè)Map集合
*/
<T> void putAll(Map<String, T> map);
/**
* 保存一個(gè)List集合
*/
void putAll(String key, List<String> list);
/**
* 根據(jù)key取出一個(gè)數(shù)據(jù)
*/
<T> T get(String key, DataType type);
/**
* 取出全部數(shù)據(jù)
*/
Map<String, ?> getAll();
/**
* 取出一個(gè)List集合
*/
List<String> getAll(String key);
/**
* 移除一個(gè)數(shù)據(jù)
*/
void remove(String key);
/**
* 移除一個(gè)集合的數(shù)據(jù)
*/
void removeAll(List<String> keys);
/**
* 移除一個(gè)集合的數(shù)據(jù)
*/
void removeAll(String[] keys);
/**
* 是否存在key
*/
boolean contains(String key);
/**
* 清除全部數(shù)據(jù)
*/
void clear();
除了基本的6種數(shù)據(jù)類型,其中還支持了List集合存儲(chǔ)的String數(shù)據(jù)旧困,當(dāng)然醇份,由于需要存入Set集合(使用的是TreeSet存儲(chǔ)),如果沒有提供比較器(Comparator)吼具,則使用默認(rèn)比較器僚纷。具體實(shí)現(xiàn)如下:
@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>
可以根據(jù)key刪除一個(gè)數(shù)據(jù),或一個(gè)集合或數(shù)組的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();
}
具體的存儲(chǔ)實(shí)現(xiàn)是一個(gè)私有的方法怖竭,實(shí)現(xiàn)如下:
/**
* 保存數(shù)據(jù)
* @param editor
* @param key
* @param obj
*/
@SuppressWarnings("unchecked")
private void put(SharedPreferences.Editor editor, String key, Object obj) {
// key 不為null時(shí)再存入,否則不存儲(chǔ)
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));
}
}
}
具體取數(shù)據(jù)的操作如下:
/**
* 根據(jù)key和類型取出數(shù)據(jù)
*/
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是一個(gè)枚舉類陡蝇,枚舉所有的可存取的數(shù)據(jù)類型
enum DataType {
INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
}
</br>
完整代碼
下面是完整的代碼:
public interface IPreference {
IPreferenceHolder prefHolder = new IPreferenceHolder();
/**
* IPreference的持有類
*/
class IPreferenceHolder {
/**
* 獲得一個(gè)新創(chuàng)建的IPreference對(duì)象
* @param context 上下文對(duì)象
* @param fileName 文件名
* @return
*/
public IPreference newPreference(Context context, String fileName){
return new PreferenceImpl(context, fileName);
}
/**
* 獲取一個(gè)IPreference對(duì)象
* @param context 上下文對(duì)象
* @return
*/
public IPreference getPreference(Context context){
return PreferenceImpl.getPreference(context);
}
/**
* 獲取一個(gè)IPreference對(duì)象
* @param context 上下文對(duì)象
* @param fileName 文件名
* @return
*/
public IPreference getPreference(Context context, String fileName){
return PreferenceImpl.getPreference(context, fileName);
}
}
/**
* 保存一個(gè)數(shù)據(jù)
* @param key 鍵
* @param value 值
*/
<T> void put(String key, T value);
/**
* 保存一個(gè)Map集合
* @param map
*/
<T> void putAll(Map<String, T> map);
/**
* 保存一個(gè)List集合
* @param key
* @param list
*/
void putAll(String key, List<String> list);
/**
* 保存一個(gè)List集合痊臭,并且自定保存順序
* @param key
* @param list
* @param comparator
*/
void putAll(String key, List<String> list, Comparator<String> comparator);
/**
* 根據(jù)key取出一個(gè)數(shù)據(jù)
* @param key 鍵
*/
<T> T get(String key, DataType type);
/**
* 取出全部數(shù)據(jù)
*/
Map<String, ?> getAll();
/**
* 取出一個(gè)List集合
* @param key
* @return
*/
List<String> getAll(String key);
/**
* 移除一個(gè)數(shù)據(jù)
* @param key
* @return
*/
void remove(String key);
/**
* 移除一個(gè)集合的數(shù)據(jù)
* @param keys
* @return
*/
void removeAll(List<String> keys);
/**
* 移除一個(gè)集合的數(shù)據(jù)
* @param keys
* @return
*/
void removeAll(String[] keys);
/**
* 是否存在key
* @return
*/
boolean contains(String key);
/**
* 清除全部數(shù)據(jù)
*/
void clear();
/**
* 獲取String類型的數(shù)據(jù)
* @param key
* @return
*/
String getString(String key);
/**
* 獲取Float類型的數(shù)據(jù)
* @param key
* @return
*/
float getFloat(String key);
/**
* 獲取int類型的數(shù)據(jù)
* @return
*/
int getInteger(String key);
/**
* 獲取long類型的數(shù)據(jù)
* @param key
* @return
*/
long getLong(String key);
/**
* 獲取Set類型的數(shù)據(jù)
* @param key
* @return
*/
Set<String> getSet(String key);
/**
* 獲取boolean類型的數(shù)據(jù)
* @param key
* @return
*/
boolean getBoolean(String key);
/**
* 枚舉:存儲(chǔ)或取出的數(shù)據(jù)類型
*/
enum DataType {
INTEGER, LONG, BOOLEAN, FLOAT, STRING, STRING_SET
}
}
具體的實(shí)現(xiàn)類:
PS:這是非public的哮肚,不允許外部直接訪問。IPreference的實(shí)現(xiàn)類對(duì)象可通過IPreference中創(chuàng)建的IPreferenceHolder對(duì)象獲取广匙,也可通過創(chuàng)建IPreferenceHolder對(duì)象來獲取允趟,如果想擴(kuò)展,就自己改寫吧
/**
* 操作SharedPreferences的工具類
* @author: DINGXIUAN
*/
class PreferenceImpl implements IPreference {
private static IPreference iPreference;
/**
* 對(duì)象鎖
*/
private static final Object lock = new Object();
/**
* 獲取IPreference對(duì)象
* @param context
* @return
*/
public static IPreference getPreference(Context context) {
synchronized (lock) {
if (iPreference== null) {
initPreference(context, FILE_NAME);
}
}
return iPreference;
}
/**
* 獲取IPreference對(duì)象
* @param context
* @param fileName
* @return
*/
public static IPreference getPreference(Context context, String fileName) {
synchronized (lock) {
if (iPreference== null) {
initPreference(context, fileName);
}
}
return iPreference;
}
/**
* 初始化IPreference對(duì)象
* @param context
* @param fileName
*/
private static synchronized void initPreference(Context context, String fileName){
if (iPreference== null){
iPreference= new PreferenceImpl(context, fileName);
}
}
/**
* 默認(rèn)的文件名
*/
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();
}
/**
* 保存一個(gè)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();
}
/**
* 根據(jù)key取出一個(gè)數(shù)據(jù)
* @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);
}
/**
* 保存數(shù)據(jù)
* @param editor
* @param key
* @param obj
*/
@SuppressWarnings("unchecked")
private void put(SharedPreferences.Editor editor, String key, Object obj) {
// key 不為null時(shí)再存入鸦致,否則不存儲(chǔ)
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));
}
}
}
/**
* 根據(jù)key和類型取出數(shù)據(jù)
* @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: // 默認(rèn)取出String類型的數(shù)據(jù)
return null;
}
}
}
比較器:
/**
* 默認(rèn)比較器潮剪,當(dāng)存儲(chǔ)List集合中的String類型數(shù)據(jù)時(shí),沒有指定比較器分唾,就使用默認(rèn)比較器
*/
public class ComparatorImpl implements Comparator<String> {
@Override
public int compare(String lhs, String rhs) {
return lhs.compareTo(rhs);
}
}