Android 使用SharedPreferences保存各种数据(List,Map,对象等)+ SpUtils工具

来源:互联网 发布:淘宝众筹首页 编辑:程序博客网 时间:2024/05/18 16:57

Android 使用SharedPreferences保存各种数据(List,Map,对象等)+ SpUtils工具


简介

存储List数据到本地的方式有很多种,对于不想用sqlite或者其他方式,又或是数据量很少的话,不妨可以试下用 SharedPreferences保存。由于SharedPreferences只能保存Map型的数据,必须要做其他转换才行。


应用场景

用于保存各种List数据,最常见的莫过于,ListView、Gridviw、RecyclerView中的数据,常用的类型会被使用到的可能会有:

  • List<String>
  • List<Map<String,Object>>
  • List<JavaBean>

其实不只这些复杂,简单的类型同样也可以保存。

Gson工具

这里处理的方式时用gson把List转换成json类型,再利用SharedPreferences保存的。

例子~

ListDataSave工具类

public class ListDataSave {      private SharedPreferences preferences;      private SharedPreferences.Editor editor;      public ListDataSave(Context mContext, String preferenceName) {          preferences = mContext.getSharedPreferences(preferenceName, Context.MODE_PRIVATE);          editor = preferences.edit();      }      /**      * 保存List      * @param tag      * @param datalist      */      public <T> void setDataList(String tag, List<T> datalist) {          if (null == datalist || datalist.size() <= 0)              return;          Gson gson = new Gson();          //转换成json数据,再保存          String strJson = gson.toJson(datalist);          editor.clear();          editor.putString(tag, strJson);          editor.commit();      }      /**      * 获取List      * @param tag      * @return      */      public <T> List<T> getDataList(String tag) {          List<T> datalist=new ArrayList<T>();          String strJson = preferences.getString(tag, null);          if (null == strJson) {              return datalist;          }          Gson gson = new Gson();          datalist = gson.fromJson(strJson, new TypeToken<List<T>>() {          }.getType());          return datalist;      }  }  

Userbean类,简单处理下,名字和年龄

public class Userbean {      private String name;      private int age;      public String getName() {          return name;      }      public void setName(String name) {          this.name = name;      }      public int getAge() {          return age;      }      public void setAge(int age) {          this.age = age;      }  }  

MainActivity类

public class MainActivity extends Activity implements OnClickListener {      Context mContext;      ListDataSave dataSave;      private ArrayList<Userbean> listBean;      private ArrayList<String> listString;      private ArrayList<Map<String, Object>> listMap;      @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.main);          initView();      }      private void initView() {          findViewById(R.id.btn_addString).setOnClickListener(this);          findViewById(R.id.btn_addJavaBean).setOnClickListener(this);          findViewById(R.id.btn_addMap).setOnClickListener(this);          findViewById(R.id.btn_getString).setOnClickListener(this);          findViewById(R.id.btn_getJavaBean).setOnClickListener(this);          findViewById(R.id.btn_getMap).setOnClickListener(this);          mContext = getApplicationContext();          dataSave = new ListDataSave(mContext, "sadaharu_song");          listString = new ArrayList<String>();          listBean = new ArrayList<Userbean>();          listMap = new ArrayList<Map<String, Object>>();      }      @Override      public void onClick(View v) {          switch (v.getId()) {          case R.id.btn_addString:              String s = "定春";              listString.add(s);              dataSave.setDataList("string", listString);              break;          case R.id.btn_getString:              Toast.makeText(mContext, dataSave.getDataList("string").toString(), Toast.LENGTH_SHORT).show();              break;          case R.id.btn_addJavaBean:              Userbean user = new Userbean();              user.setName("银时");              user.setAge(16);              listBean.add(user);              dataSave.setDataList("javaBean", listBean);              break;          case R.id.btn_getJavaBean:              Toast.makeText(mContext, dataSave.getDataList("javaBean").toString(), Toast.LENGTH_SHORT).show();              break;          case R.id.btn_addMap:              Map<String, Object> map=new HashMap<String, Object>();              map.put("name","神乐");              map.put("age", 18);              listMap.add(map);              dataSave.setDataList("listMap", listMap);              break;          case R.id.btn_getMap:              Toast.makeText(mContext, dataSave.getDataList("listMap").toString(), Toast.LENGTH_SHORT).show();              break;          }      }  }  

以上可以完成对着一些类型使用SharedPreferences的传递。

SharedPreferences工具类

大家也可以使用这个工具类来使用SharedPreferences传递各种数据

import android.content.Context;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.text.TextUtils;import android.util.Base64;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class SpUtils {    private static SharedPreferences sp;    private static SharedPreferences.Editor editor;    private static SharedPreferences getSp(Context context) {        if (sp == null) {            sp = context.getSharedPreferences("SpUtils", Context.MODE_PRIVATE);            editor = sp.edit();        }        return sp;    }    /**     * 存入字符串     *     * @param context 上下文     * @param key     字符串的键     * @param value   字符串的值     */    public static void putString(Context context, String key, String value) {        SharedPreferences preferences = getSp(context);        //存入数据        Editor editor = preferences.edit();        editor.putString(key, value);        editor.commit();    }    /**     * 获取字符串     *     * @param context 上下文     * @param key     字符串的键     * @return 得到的字符串     */    public static String getString(Context context, String key) {        SharedPreferences preferences = getSp(context);        return preferences.getString(key, "");    }    /**     * 获取字符串     *     * @param context 上下文     * @param key     字符串的键     * @param value   字符串的默认值     * @return 得到的字符串     */    public static String getString(Context context, String key, String value) {        SharedPreferences preferences = getSp(context);        return preferences.getString(key, value);    }    /**     * 保存布尔值     *     * @param context 上下文     * @param key     键     * @param value   值     */    public static void putBoolean(Context context, String key, boolean value) {        SharedPreferences sp     = getSp(context);        Editor            editor = sp.edit();        editor.putBoolean(key, value);        editor.commit();    }    /**     * 获取布尔值     *     * @param context  上下文     * @param key      键     * @param defValue 默认值     * @return 返回保存的值     */    public static boolean getBoolean(Context context, String key, boolean defValue) {        SharedPreferences sp = getSp(context);        return sp.getBoolean(key, defValue);    }    /**     * 保存long值     *     * @param context 上下文     * @param key     键     * @param value   值     */    public static void putLong(Context context, String key, long value) {        SharedPreferences sp     = getSp(context);        Editor            editor = sp.edit();        editor.putLong(key, value);        editor.commit();    }    /**     * 获取long值     *     * @param context  上下文     * @param key      键     * @param defValue 默认值     * @return 保存的值     */    public static long getLong(Context context, String key, long defValue) {        SharedPreferences sp = getSp(context);        return sp.getLong(key, defValue);    }    /**     * 保存int值     *     * @param context 上下文     * @param key     键     * @param value   值     */    public static void putInt(Context context, String key, int value) {        SharedPreferences sp     = getSp(context);        Editor            editor = sp.edit();        editor.putInt(key, value);        editor.commit();    }    /**     * 获取long值     *     * @param context  上下文     * @param key      键     * @param defValue 默认值     * @return 保存的值     */    public static int getInt(Context context, String key, int defValue) {        SharedPreferences sp = getSp(context);        return sp.getInt(key, defValue);    }    /**     * 保存对象     *     * @param context 上下文     * @param key     键     * @param obj     要保存的对象(Serializable的子类)     * @param <T>     泛型定义     */    public static <T extends Serializable> void putObject(Context context, String key, T obj) {        try {            put(context, key, obj);        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * 获取对象     *     * @param context 上下文     * @param key     键     * @param <T>     指定泛型     * @return 泛型对象     */    public static <T extends Serializable> T getObject(Context context, String key) {        try {            return (T) get(context, key);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }    /**     * 保存List     * @param tag     * @param datalist     */    public <T> void setDataList(String tag, List<T> datalist) {        if (null == datalist || datalist.size() <= 0)            return;        Gson gson = new Gson();        //转换成json数据,再保存        String strJson = gson.toJson(datalist);        editor.clear();        editor.putString(tag, strJson);        editor.commit();    }    /**     * 获取List     * @param tag     * @return     */    public <T> List<T> getDataList(String tag) {        List<T> datalist=new ArrayList<>();        String strJson = sp.getString(tag, null);        if (null == strJson) {            return datalist;        }        Gson gson = new Gson();        datalist = gson.fromJson(strJson, new TypeToken<List<T>>() {        }.getType());        return datalist;    }    /**     * 存储Map集合     * @param key 键     * @param map 存储的集合     * @param <K> 指定Map的键     * @param <T> 指定Map的值     */    public <K,T> void setMap(String key , Map<K,T> map){        if (map == null || map.isEmpty() || map.size() < 1){            return;        }        Gson gson = new Gson();        String strJson  = gson.toJson(map);        editor.clear();        editor.putString(key ,strJson);        editor.commit();    }    /**    * 获取Map集合    * */    public <K,T> Map<K,T> getMap(String key){        Map<K,T> map = new HashMap<>();        String strJson = sp.getString(key,null);        if (strJson == null){            return map;        }        Gson gson = new Gson();        map = gson.fromJson(strJson,new TypeToken<Map<K,T> >(){}.getType());        return map;    }    /**存储对象*/    private static void put(Context context, String key, Object obj)            throws IOException    {        if (obj == null) {//判断对象是否为空            return;        }        ByteArrayOutputStream baos = new ByteArrayOutputStream();        ObjectOutputStream    oos  = null;        oos = new ObjectOutputStream(baos);        oos.writeObject(obj);        // 将对象放到OutputStream中        // 将对象转换成byte数组,并将其进行base64编码        String objectStr = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));        baos.close();        oos.close();        putString(context, key, objectStr);    }    /**获取对象*/    private static Object get(Context context, String key)            throws IOException, ClassNotFoundException    {        String wordBase64 = getString(context, key);        // 将base64格式字符串还原成byte数组        if (TextUtils.isEmpty(wordBase64)) { //不可少,否则在下面会报java.io.StreamCorruptedException            return null;        }        byte[]               objBytes = Base64.decode(wordBase64.getBytes(), Base64.DEFAULT);        ByteArrayInputStream bais     = new ByteArrayInputStream(objBytes);        ObjectInputStream    ois      = new ObjectInputStream(bais);        // 将byte数组转换成product对象        Object obj = ois.readObject();        bais.close();        ois.close();        return obj;    }}

此工具类的GitHub地址:https://github.com/sadaharusong/SpUtils
欢迎各位互相探讨,Star,Follow~

阅读全文
0 0
原创粉丝点击