Android 使用SharedPreferences保存各种数

作者: 萨达哈鲁酱 | 来源:发表于2019-03-05 19:23 被阅读4次

    简介

    存储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~

    相关文章

      网友评论

        本文标题:Android 使用SharedPreferences保存各种数

        本文链接:https://www.haomeiwen.com/subject/vuzouqtx.html