SharedPreferences中存储bean类集合或者存储bean类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/RELY_ON_YOURSELF/article/details/81457049

存储List数据到本地的常用方式一般是用sqlite,但是如果不想用sqlite,或者数据量很少,使用SharedPreferences也是一种不错的选择。

本案例需要注意两点

  • 此Demo的json解析使用的是fastjson , 使用demo中的方法之前一定要添加fastjson 依赖 , fastjson 教程可以参考:https://github.com/alibaba/fastjson
  • 这个需要特别注意 , 本人踩的坑 . 实体类需要有一个空的构造函数 , 否则会报错: com.alibaba.fastjson.JSONException: default constructor not
    found……

Demo下载链接:https://download.csdn.net/download/rely_on_yourself/10586652

有错误的地方请指正 , 大家多多交流.

代码如下

MainActivity类代码:

package com.example.li_yx.spdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button mSaveBeanList;
    private Button mGetBeanList;
    private ArrayList<Teacher> mTeachers;
    private Button mGetBean;
    private Button mSaveBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSaveBeanList = findViewById(R.id.saveBeanList);
        mGetBeanList = findViewById(R.id.getBeanList);
        mGetBean = findViewById(R.id.getBean);
        mSaveBean = findViewById(R.id.saveBean);

        initData();

        mSaveBeanList.setOnClickListener(this);
        mGetBeanList.setOnClickListener(this);
        mSaveBean.setOnClickListener(this);
        mGetBean.setOnClickListener(this);
    }


    private void initData() {

        mTeachers = new ArrayList<>();

        ArrayList<Student> students = new ArrayList<>();
        Student studentone = new Student("student_one", 12);
        Student studenttwo = new Student("student_two", 15);
        students.add(studentone);
        students.add(studenttwo);

        Teacher teacher1 = new Teacher("ljl", 27, students);
        Teacher teacher2 = new Teacher("lyx", 22, students);
        mTeachers.add(teacher1);
        mTeachers.add(teacher2);

    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        switch (id) {
            case R.id.saveBeanList:
                saveBeanList();
                break;
            case R.id.getBeanList:
                getBeanList();
                break;
            case R.id.saveBean:
                saveBean();
                break;
            case R.id.getBean:
                getBean();
                break;
            default:
                break;
        }
    }

    private void saveBean() {
        Student student = new Student("罗辑", 32);
        String str = JSON.toJSONString(student);
        CtsSPUtil.put(MainActivity.this, "TestTwo", str);
    }

    public void getBean() {
        String testTwo = (String) CtsSPUtil.get(MainActivity.this, "TestTwo", "");
        Student student = parseObject(testTwo, Student.class);
        System.out.println(student);
    }

    private void saveBeanList() {
        String str = JSON.toJSONString(mTeachers);
        CtsSPUtil.put(MainActivity.this, "TestOne", str);
    }

    public void getBeanList() {
        String testOne = (String) CtsSPUtil.get(MainActivity.this, "TestOne", "");
        List<Teacher> teachers = parseArray(testOne, Teacher.class);
        System.out.println(teachers.size());
    }


    public static <T> List<T> parseArray(String jsonString, Class<T> clazz) {
        if (TextUtils.isEmpty(jsonString)) return null;
        return JSON.parseArray(jsonString, clazz);
    }

    public static <T> T parseObject(String jsonString, Class<T> clazz) {
        if (TextUtils.isEmpty(jsonString)) return null;
        return JSON.parseObject(jsonString, clazz);
    }


}

CtsSPUtil工具类:

package com.example.li_yx.spdemo;

import android.content.Context;
import android.content.SharedPreferences;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

public class CtsSPUtil {

    /**
     * 保存在手机里面的文件名
     */
    public static final String FILE_NAME = "cts_sp_data";

    /**
     * 保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法
     */
    public static void put(Context context, String key, Object object) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 得到保存数据的方法,我们根据默认值得到保存的数据的具体类型,然后调用相对于的方法获取值
     */
    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }

    /**
     * 移除某个key值已经对应的值
     */
    public static void remove(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 清除所有数据
     */
    public static void clear(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 查询某个key是否已经存在   
     */
    public static boolean contains(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.contains(key);
    }

    /**
     * 返回所有的键值对   
     */
    public static Map<String, ?> getAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.getAll();
    }

    /**
     * 创建一个解决SharedPreferencesCompat.apply方法的一个兼容类
     */
    private static class SharedPreferencesCompat {

        private static final Method sApplyMethod = findApplyMethod();

        /**
         * 反射查找apply的方法
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }
            return null;
        }

        /**
         * 如果找到则使用apply执行,否则使用commit    
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (sApplyMethod != null) {
                    sApplyMethod.invoke(editor);
                    return;
                }
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
            editor.commit();
        }

    }

}

Teacher类:

package com.example.li_yx.spdemo;

import java.util.ArrayList;

public class Teacher {

    private String name;
    private int age;
    private ArrayList<Student> mStudents;

    public Teacher(){}

    public Teacher(String name, int age, ArrayList<Student> students) {
        this.name = name;
        this.age = age;
        mStudents = students;
    }

    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;
    }

    public ArrayList<Student> getStudents() {
        return mStudents;
    }

    public void setStudents(ArrayList<Student> students) {
        mStudents = students;
    }
}

Student类:

package com.example.li_yx.spdemo;

public class Student {

    private String name;
    private int age;

    public Student(){}

    public Student(String name, int age) {
        this.name = name;
        this.age = 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;
    }

}

猜你喜欢

转载自blog.csdn.net/RELY_ON_YOURSELF/article/details/81457049
今日推荐