Android SharedPreferences工具类 ,实现List/Map的保存读取

最近因为需要将List集合和Map集合的数据保存到SharedPreferences中,所以对以前自己封装的SharedPreferencesUtil进行了修改,在原有的保存读Integer,String,Float,Long,Boolean,Object的基础上增加了保存读取List<Object>以及Map<String,Object>的功能。话不多说,下面直接贴代码和简单的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 <T> boolean putListData(String key, List<T> 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 <T> List<T> getListData(String key, Class<T> cls) {
        List<T> 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 <K, V> boolean putHashMapData(String key, Map<K, V> 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 <V> HashMap<String, V> getHashMapData(String key, Class<V> clsV) {
        String json = sp.getString(key, "");
        HashMap<String, V> map = new HashMap<>();
        Gson gson = new Gson();
        JsonObject obj = new JsonParser().parse(json).getAsJsonObject();
        Set<Map.Entry<String, JsonElement>> entrySet = obj.entrySet();
        for (Map.Entry<String, JsonElement> 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<Integer> integers = new ArrayList<>();
    private List<HumanBean> humanBeens = new ArrayList<>();
    private List<String> strings = new ArrayList<>();
    //Map
    private Map<String, HumanBean> 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<String> 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<Integer> 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 +
                '}';
    }
}
--------------------- 
作者:Black_Hao 
来源:CSDN 
原文:https://blog.csdn.net/a512337862/article/details/73633420 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/fanleiym/article/details/84875621