转载请注明出处:http://blog.csdn.net/a512337862/article/details/73633420

最近因为需要将List集合和Map集合的数据保存到SharedPreferences中,所以对以前自己封装的SharedPreferencesUtil进行了修改,在原有的保存读Integer,String,Float,Long,Boolean,Object的基础上增加了保存读取List以及Map的功能。话不多说,下面直接贴代码和简单的Demo,仅供参考:

SharedPreferencesUtil

代码

/** * Created by ZhangHao on 2016/6/21. * SharedPreferences 工具类 */public class SharedPreferencesUtil {    private static SharedPreferencesUtil util;    private static SharedPreferences sp;    private SharedPreferencesUtil(Context context, String name) {        sp = context.getSharedPreferences(name, Context.MODE_PRIVATE);    }    /**     * 初始化SharedPreferencesUtil,只需要初始化一次,建议在Application中初始化     *     * @param context 上下文对象     * @param name    SharedPreferences Name     */    public static void getInstance(Context context, String name) {        if (util == null) {            util = new SharedPreferencesUtil(context, name);        }    }    /**     * 保存数据到SharedPreferences     *     * @param key   键     * @param value 需要保存的数据     * @return 保存结果     */    public static boolean putData(String key, Object value) {        boolean result;        SharedPreferences.Editor editor = sp.edit();        String type = value.getClass().getSimpleName();        try {            switch (type) {                case "Boolean":                    editor.putBoolean(key, (Boolean) value);                    break;                case "Long":                    editor.putLong(key, (Long) value);                    break;                case "Float":                    editor.putFloat(key, (Float) value);                    break;                case "String":                    editor.putString(key, (String) value);                    break;                case "Integer":                    editor.putInt(key, (Integer) value);                    break;                default:                    Gson gson = new Gson();                    String json = gson.toJson(value);                    editor.putString(key, json);                    break;            }            result = true;        } catch (Exception e) {            result = false;            e.printStackTrace();        }        editor.apply();        return result;    }    /**     * 获取SharedPreferences中保存的数据     *     * @param key          键     * @param defaultValue 获取失败默认值     * @return 从SharedPreferences读取的数据     */    public static Object getData(String key, Object defaultValue) {        Object result;        String type = defaultValue.getClass().getSimpleName();        try {            switch (type) {                case "Boolean":                    result = sp.getBoolean(key, (Boolean) defaultValue);                    break;                case "Long":                    result = sp.getLong(key, (Long) defaultValue);                    break;                case "Float":                    result = sp.getFloat(key, (Float) defaultValue);                    break;                case "String":                    result = sp.getString(key, (String) defaultValue);                    break;                case "Integer":                    result = sp.getInt(key, (Integer) defaultValue);                    break;                default:                    Gson gson = new Gson();                    String json = sp.getString(key, "");                    if (!json.equals("") && json.length() > 0) {                        result = gson.fromJson(json, defaultValue.getClass());                    } else {                        result = defaultValue;                    }                    break;            }        } catch (Exception e) {            result = null;            e.printStackTrace();        }        return result;    }    /**     * 用于保存集合     *     * @param key  key     * @param list 集合数据     * @return 保存结果     */    public static  boolean putListData(String key, List list) {        boolean result;        String type = list.get(0).getClass().getSimpleName();        SharedPreferences.Editor editor = sp.edit();        JsonArray array = new JsonArray();        try {            switch (type) {                case "Boolean":                    for (int i = 0; i < list.size(); i++) {                        array.add((Boolean) list.get(i));                    }                    break;                case "Long":                    for (int i = 0; i < list.size(); i++) {                        array.add((Long) list.get(i));                    }                    break;                case "Float":                    for (int i = 0; i < list.size(); i++) {                        array.add((Float) list.get(i));                    }                    break;                case "String":                    for (int i = 0; i < list.size(); i++) {                        array.add((String) list.get(i));                    }                    break;                case "Integer":                    for (int i = 0; i < list.size(); i++) {                        array.add((Integer) list.get(i));                    }                    break;                default:                    Gson gson = new Gson();                    for (int i = 0; i < list.size(); i++) {                        JsonElement obj = gson.toJsonTree(list.get(i));                        array.add(obj);                    }                    break;            }            editor.putString(key, array.toString());            result = true;        } catch (Exception e) {            result = false;            e.printStackTrace();        }        editor.apply();        return result;    }    /**     * 获取保存的List     *     * @param key key     * @return 对应的Lis集合     */    public static  List getListData(String key, Class cls) {        List list = new ArrayList<>();        String json = sp.getString(key, "");        if (!json.equals("") && json.length() > 0) {            Gson gson = new Gson();            JsonArray array = new JsonParser().parse(json).getAsJsonArray();            for (JsonElement elem : array) {                list.add(gson.fromJson(elem, cls));            }        }        return list;    }    /**     * 用于保存集合     *     * @param key key     * @param map map数据     * @return 保存结果     */    public static  boolean putHashMapData(String key, Map map) {        boolean result;        SharedPreferences.Editor editor = sp.edit();        try {            Gson gson = new Gson();            String json = gson.toJson(map);            editor.putString(key, json);            result = true;        } catch (Exception e) {            result = false;            e.printStackTrace();        }        editor.apply();        return result;    }    /**     * 用于保存集合     *     * @param key key     * @return HashMap     */    public static  HashMap getHashMapData(String key, Class clsV) {        String json = sp.getString(key, "");        HashMap map = new HashMap<>();        Gson gson = new Gson();        JsonObject obj = new JsonParser().parse(json).getAsJsonObject();        Set> entrySet = obj.entrySet();        for (Map.Entry entry : entrySet) {            String entryKey = entry.getKey();            JsonObject value = (JsonObject) entry.getValue();            map.put(entryKey, gson.fromJson(value, clsV));        }        Log.e("SharedPreferencesUtil", obj.toString());        return map;    }}

SharedPreferences是无法直接保存Object,List集合和Map集合的,需要先将它们转换为字符串,在保存到SharedPreferences中,取得时候再把对应的字符串转为Object,List集合或者Map集合。
我这里的做法是利用Gson将Object,List或者Map转成Json保存到SharedPreferences中,取数据的时候再通过Gson将json数据转成Object,List集合或者Map集合。

使用步骤

1、初始化:

2、保存常规数据:

3、读取常规数据 :

4、保存List集合:

5、读取List集合:

6.保存Map集合:

7、读取Map集合:

Demo

SharedPreferencesUtil的使用方法十分简单,基本上不需要Demo就能直接使用。但这里还是把demo代码贴一下,觉得没必要的可以直接略过:

Activity

/** * Created by ZhangHao on 2017/6/23. * 用来测试SharedPreferencesUtil工具类 */public class SpActivity extends AppCompatActivity {    @BindView(R.id.boolean_check)    CheckBox booleanCheck;    @BindView(R.id.int_input)    EditText intInput;    @BindView(R.id.text_input)    EditText textInput;    @BindView(R.id.float_input)    EditText floatInput;    @BindView(R.id.long_input)    EditText longInput;    @BindView(R.id.showResult)    TextView showResult;    private String intKey = "intKey";    private String stringKey = "stringKey";    private String floatKey = "floatKey";    private String longKey = "longKey";    private String booleanKey = "booleanKey";    private String beanKey = "beanKey";    private String hunmansKey = "hunmansKey";    private String intsKey = "intsKey";    private String strsKey = "strsKey";    private String mapKey = "mapKey";    private HumanBean bean;    //List    private List integers = new ArrayList<>();    private List humanBeens = new ArrayList<>();    private List strings = new ArrayList<>();    //Map    private Map map = new HashMap<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_sp);        ButterKnife.bind(this);        //初始化HumanBean        bean = new HumanBean(true, 20, "Black_Hao", 24f, "男", System.currentTimeMillis()                , new SchoolBean("AnHui", 20, System.currentTimeMillis(), false));    }    public void onClick(View view) {        switch (view.getId()) {            case R.id.save_input:                //保存从EditText输入的常规数据到sp                boolean bool = booleanCheck.isChecked();                String str = textInput.getText().toString().trim();                int in = Integer.parseInt(intInput.getText().toString());                float f = Float.parseFloat(floatInput.getText().toString().trim());                long lo = Long.parseLong(longInput.getText().toString().trim());                boolean resultBol = SharedPreferencesUtil.putData(booleanKey, bool);                boolean resultInt = SharedPreferencesUtil.putData(intKey, in);                boolean resultStr = SharedPreferencesUtil.putData(stringKey, str);                boolean resultFlo = SharedPreferencesUtil.putData(floatKey, f);                boolean resultLon = SharedPreferencesUtil.putData(longKey, lo);                boolean resultBea = SharedPreferencesUtil.putData(beanKey, bean);                showResult.setText("resultBol:---" + resultBol + " \nresultInt:--- " + resultInt                        + " \nresultStr:--- " + resultStr + " \nresultFlo:--- " +                        resultFlo + "  \nresultLon:--- " + resultLon                        + " \nresultBea --- " + resultBea);                break;            case R.id.get_input:                //读取常规数据并显示到showResult                boolean Bol = (boolean) SharedPreferencesUtil.getData(booleanKey, false);                int Int = (int) SharedPreferencesUtil.getData(intKey, -1);                String Str = (String) SharedPreferencesUtil.getData(stringKey, "");                float Flo = (float) SharedPreferencesUtil.getData(floatKey, 0f);                long Lon = (long) SharedPreferencesUtil.getData(longKey, 1L);                HumanBean Bea = (HumanBean) SharedPreferencesUtil.getData(beanKey, bean);                showResult.setText(Bol + " \n " + Int + " \n " + Str                        + " \n " + Flo + " \n " + Lon + " \n " + Bea.toString());                break;            case R.id.save_list:                //保存List数据到SharedPreferences                getDefaultList();                boolean resultInts = SharedPreferencesUtil.putListData(intsKey, integers);                boolean resultBeans = SharedPreferencesUtil.putListData(hunmansKey, humanBeens);                boolean resultStrs = SharedPreferencesUtil.putListData(strsKey, strings);                showResult.setText("resultInts:---" + resultInts                        + "\nresultBeans:---" + resultBeans + "\nresultStrs:---" + resultStrs);                break;            case R.id.get_list:                读取Map数据并显示到showResult                integers.clear();                humanBeens.clear();                strings.clear();                integers.addAll(SharedPreferencesUtil.getListData(intsKey, Integer.class));                humanBeens.addAll(SharedPreferencesUtil.getListData(hunmansKey, HumanBean.class));                strings.addAll(SharedPreferencesUtil.getListData(strsKey, String.class));                //遍历integers并将结果打印                String intsStr = "{";                for (int i = 0; i < integers.size(); i++) {                    intsStr += integers.get(i) + " --- ";                }                intsStr += "}";                //遍历humanBeens并将结果打印                String humsStr = "";                for (int i = 0; i < humanBeens.size(); i++) {                    humsStr += humanBeens.get(i).toString() + "\n";                }                //遍历strings并将结果打印                String strs = "{";                for (int i = 0; i < strings.size(); i++) {                    strs += strings.get(i) + " ---- ";                }                strs += "}";                showResult.setText(intsStr + "\n" + humsStr + "\n" + strs);                break;            case R.id.save_map:                //保存Map数据到SharedPreferences                getDefaultList();                boolean resultMap = SharedPreferencesUtil.putHashMapData(mapKey, map);                showResult.setText("resultMap:---" + resultMap);                break;            case R.id.get_map:                //读取Map数据并显示到showResult                map.clear();                map.putAll(SharedPreferencesUtil.getHashMapData(mapKey, HumanBean.class));                //遍历map并将结果打印                String mapStr = "";                for (String key : map.keySet()) {                    mapStr += key + " : " + map.get(key).toString() + "\n";                }                showResult.setText(mapStr);                break;        }    }    /**     * 生成默认数据以保存到SharedPreferences     */    private void getDefaultList() {        integers.clear();        humanBeens.clear();        strings.clear();        String[] names = new String[]{"Black_Hao", "White_Hao", "Gray_Hao", "Blue_Hao"};        Random random = new Random();        for (int i = 0; i < 20; i++) {            int s = random.nextInt(100);            integers.add(s);            humanBeens.add(new HumanBean(s % 2 == 0, s, names[s % 4], 24f, "男", System.currentTimeMillis()                    , new SchoolBean("AnHui", 20, System.currentTimeMillis(), s % 3 == 0)));            strings.add(names[s % 4]);            map.put(strings.get(i) + i, humanBeens.get(i));        }    }}

Layout

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:orientation="horizontal">        <CheckBox            android:id="@+id/boolean_check"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:layout_marginStart="5dp"            android:checked="true" />        <EditText            android:id="@+id/int_input"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:layout_weight="1"            android:hint="Integer"            android:inputType="number" />        <EditText            android:id="@+id/text_input"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:layout_weight="1"            android:hint="String"            android:inputType="text" />        <EditText            android:id="@+id/float_input"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:layout_weight="1"            android:hint="Float"            android:inputType="number" />        <EditText            android:id="@+id/long_input"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:layout_weight="1"            android:hint="Long"            android:inputType="number" />    LinearLayout>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginTop="5dp"        android:orientation="horizontal">        <Button            android:id="@+id/save_input"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="SaveBasic" />        <Button            android:id="@+id/get_input"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="GetBasic" />        <Button            android:id="@+id/save_list"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="SaveList" />        <Button            android:id="@+id/get_list"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="ReadList" />        <Button            android:id="@+id/save_map"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="SaveMap" />        <Button            android:id="@+id/get_map"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="5dp"            android:onClick="onClick"            android:text="ReadMap" />    LinearLayout>    <TextView        android:id="@+id/showResult"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_margin="5dp" />LinearLayout>

Application

这里Application只做了初始化SharedPreferencesUtil的操作

/** * Created by ZhangHao on 2017/6/23. */public class HaoApp extends Application {    @Override    public void onCreate() {        super.onCreate();        SharedPreferencesUtil.getInstance(this, "Test");    }}

自定义实体类

为了测试Object保存读取,自定义两个简单的实体类

HumanBean

/** * Created by ZhangHao on 2017/6/23. * 用来测试SharedPreferencesUtil */public class HumanBean {    private boolean isTest;    private int num;    private String name;    private String sex;    private float age;    private long time;    private SchoolBean bean;    private List family;    public HumanBean(boolean isTest, int num, String name, float age,                     String sex, long time, SchoolBean bean) {        this.isTest = isTest;        this.num = num;        this.name = name;        this.age = age;        this.sex = sex;        this.time = time;        this.bean = bean;        family = new ArrayList<>();        family.add("Father");        family.add("Mother");        family.add("Sister");        family.add("Brother");        family.add("Self");    }    public boolean isTest() {        return isTest;    }    public void setTest(boolean test) {        isTest = test;    }    public int getNum() {        return num;    }    public void setNum(int num) {        this.num = num;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getSex() {        return sex;    }    public void setSex(String sex) {        this.sex = sex;    }    public float getAge() {        return age;    }    public void setAge(float age) {        this.age = age;    }    public long getTime() {        return time;    }    public void setTime(long time) {        this.time = time;    }    public SchoolBean getBean() {        return bean;    }    public void setBean(SchoolBean bean) {        this.bean = bean;    }    @Override    public String toString() {        return "HumanBean{" +                "isTest=" + isTest +                ", num=" + num +                ", name='" + name + '\'' +                ", sex='" + sex + '\'' +                ", age=" + age +                ", time=" + time +                ", bean=" + bean +                ", family=" + family +                '}';    }}

SchoolBean

/** * Created by ZhangHao on 2017/6/23. * 用来测试SharedPreferencesUtil */public class SchoolBean {    private String homeAddr;    private int grade;    private long schoolTime;    private boolean isBoarding;    private List students;    public SchoolBean(String homeAddr, int grade, long schoolTime, boolean isBoarding) {        this.homeAddr = homeAddr;        this.grade = grade;        this.schoolTime = schoolTime;        this.isBoarding = isBoarding;        students = new ArrayList<>();        students.add(15);        students.add(105);        students.add(150);    }    public String getHomeAddr() {        return homeAddr;    }    public void setHomeAddr(String homeAddr) {        this.homeAddr = homeAddr;    }    public int getGrade() {        return grade;    }    public void setGrade(int grade) {        this.grade = grade;    }    public long getSchoolTime() {        return schoolTime;    }    public void setSchoolTime(long schoolTime) {        this.schoolTime = schoolTime;    }    public boolean isBoarding() {        return isBoarding;    }    public void setBoarding(boolean boarding) {        isBoarding = boarding;    }    @Override    public String toString() {        return "SchoolBean{" +                "homeAddr='" + homeAddr + '\'' +                ", grade=" + grade +                ", schoolTime=" + schoolTime +                ", isBoarding=" + isBoarding +                ", students=" + students +                '}';    }}

结语

1、因为本人文字功底有限,所以介绍性的文字很少,但是基本上每句代码都加了注释,理解起来应该不难,如果有任何问题,可以留言。
2、关于Map的读取暂时只实现Map的类型,至于Map的类型,有时间会补上的。

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android:SQLite数据库
  3. Android保存位图
  4. Android数据库升级,数据不丢失解决方案
  5. android数据库操作之直接读取db文件
  6. android将InputStream转为FileOutputStream保存HttpURLConnectio
  7. pAdTy_-5 保存数据
  8. Android(安卓)TTS 初体验
  9. Android(安卓)平台点对点音视频对讲

随机推荐

  1. Activity布局初步(一)
  2. Android,谁动了我的内存(转)
  3. Android高手进阶教程(二十一)之---Androi
  4. (4.1.15)Android 基础教程之-------Android
  5. android 中style的使用
  6. Android(安卓)FileHelper 打开各种类型文
  7. [置顶] Android开发:在onTouchEvent中处理
  8. Android开发之旅:应用程序基础及组件
  9. android配置总结
  10. Android SD卡简单的文件读写操作