在Android开发中封装一个SharedPreferences工具,可以快速的对各数据类型进行本地化保存中,有效提高开发效率。
除了支持常用的几种数据类型,我们还可以通过Gson来对实体类、List类型以及HashMap来实现本地的保存和读取。
一、新建SpUtil.java工具类
构造函数定义好sharedPreferences存取数据的key值,获取editor对象、gson对象,最后使用单例模式实例化SpUtil。
public class SpUtil{
private final SharedPreferences sharedPreferences;
private final SharedPreferences.Editor editor;
private final Gson gson;
private static SpUtil spUtil;
private SpUtil(Context context){
sharedPreferences = context.getSharedPreferences("sp_data",Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
gson = new Gson();
}
public static SpUtilgetInstance (Context context){
if (spUtil == null){
spUtil = new SpUtil(context);
}
return spUtil;
}
}
二、常用类型封装
这里只是列了几种常用的类型,大家可以举一反三进行封装
//保存
public void putInt(String key, int num){
editor.putInt(key, num);
editor.apply();
}
public void putString(String key, String content){
editor.putString(key, content);
editor.apply();
}
public void putBoolean(String key, boolean value){
editor.putBoolean(key, value);
editor.apply();
}
public void putLong(String key, long value){
editor.putLong(key, value);
editor.apply();
}
//读取
public int getInt(String key){
return sharedPreferences.getInt(key, 0);
}
public String getString(String key){
return sharedPreferences.getString(key,"");
}
public boolean getBoolean(String key){
return sharedPreferences.getBoolean(key,false);
}
public long getLong(String key){
return sharedPreferences.getLong(key,0);
}
二、实体类、List类型封装
使用Gson将复杂类型转换成String类型再进行保存
//保存对象
public void putObject(String key, Object obj){
String json = gson.toJson(obj);
putString(key, json);
}
//获取对象
public <T> T getObject(String key, Class<T> clazz){
String json = getString(key);
if (TextUtils.isEmpty(json)){
return null;
}
return gson.fromJson(json, clazz);
}
//删除对象
public void removeObject(String key){
editor.remove(key);
editor.apply();
}
//保存列表
public void putObjList(String key, List objectList){
String json = gson.toJson(objectList);
putString(key, json);
}
//获取列表
public <T> List<T> getObjList(String key){
List<T> list;
String json = getString(key);
if (TextUtils.isEmpty(json)){
return null;
}
list = gson.fromJson(json, new TypeToken<List<T>>(){}.getType());
return list;
}
三、HashMap封装
保存map数据:
将map数据由gson对象转换成String,并由editor提交保存,返回保存结果。
/**
* 将map集合转化为json数据保存在sharePreferences中
*
* @param key key sharePreferences数据Key
* @param map map数据
* @return 保存结果
*/
public <K,V> boolean putMap(String key , Map<K,V> map){
boolean result;
try {
String json = gson.toJson(map);
editor.putString(key , json);
editor.apply();
result = true;
}catch (Exception e){
result = false;
e.printStackTrace();
}
return result;
}
获取map数据:
先通过sharePreferences对象获取本地String数据,如果数据为空则返回。获取到本地数据以后,使用gson中的fromJson方法读取String数据最后通过TypeToken类完成数据的类型转换。
/**
* 从本地获取保存的map数据
* 缺点:将Integer默认转化为Double
* */
public <K,V> HashMap<K,V> getMap(String key){
String mapJson = getString(key);
if (TextUtils.isEmpty(mapJson)){
return null;
}
return gson.fromJson(mapJson, new TypeToken<HashMap<K,V>>(){}.getType());
}
读取已保存的map数据:
public <K,V> void showMapData(Map<K,V> map){
for (K key : map.keySet()){
Log.d("qzh", "key:"+key+" value:"+map.get(key));
}
}
四、在MainActivty中使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SpUtil spUtil= SpUtil.getInstance(this);
//简单类型存取
spUtil.putInt("first", 1);
spUtil.getInt("first");
//hashMap存取
HashMap<String , Integer> map = new HashMap<>();
map.put("铁柱",30);
map.put("小凤",28);
map.put("阿珍",26);
map.put("阿强",27);
if (spUtil.putMap("MAP_DATA",map)){
HashMap<String , Integer> hashMap = spUtil.getMap("MAP_DATA");
if (hashMap != null ){
spUtil.showMapData(hashMap);
}
}else {
Log.e(TAG, "1111" );
}
}
最后来康康读取保存后的map数据
OK,打完收工~