zoukankan      html  css  js  c++  java
  • SharedPreferences 存List集合,模拟数据库,随时存取

    PS:SharedPreferences只要稍微学过一点就会用,他本身通过创建一个Editor对象,来存储提交,而editor可以存的格式为

    他里面可以存一个Set<String> 

    Set<String> list=new HashSet<>();
                list.add("111"); 
                list.add("111");
                editor.putStringSet(keyStr,list);
    

    HashSet是Java中非常常用的数据结构对象,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key 。这里有hashset百度百科,不懂的可以看看https://baike.baidu.com/item/HashSet/8887897?fr=aladdin

     

    Set也是一个集合,但是该集合不能存重复的值,不像list集合那样常用,但是SP只能存放Set,不能直接存放List,但是我们可以把他转换成字符串,读取的时候把字符串再转变成List就可以,我之前参加国赛的时候,就会用到很多数据,之前都是写SQLite,但是SQLite不是很好管理,而且,存的东西非常少的时候,再写SQLite就感觉到没必要了,所以,就写了这样一个转换类。

    • 写入:字符串-->List集合

    • 读取:List集合-->字符串  

    方法一 

    该方法不依赖外部jar包,就是没有网络也是可以做了,但方法二是需要添加一个依赖,就是GSON。

    1:我写的是List<Object[]> ,只要是该形式,Object的长度是多少都行。(当然不能超过限制)

    package day1.cn.ceshi001;
    
    import android.content.Context;
    import android.content.SharedPreferences;
    import android.util.Log;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by liuzhitong on 2017/6/6.
     *
     * @Author : liuzhitong
     * @Description :
     */
    
    public class ListOrStrTools {
        public Context context;
        public String spStr,keyStr;
        private final SharedPreferences sp1;
        private Object[] obj;
    
        public ListOrStrTools(Context context, String spStr, String keyStr) {
            this.context = context;
            this.spStr = spStr;
            this.keyStr = keyStr;
            sp1 = context.getSharedPreferences(spStr,0);
        }
    
        public void setData(List<Object[]> lis){
    
            //存入之前要先把之前的数据拿出来
            String str="";
            String s=sp1.getString(keyStr,"404");
            if(s.equals("404")){
                Log.e("sp添加出错","404");
            }
            else{str+=s;}
            if(lis.size()==0){
                Log.e("sp----lis","0");
            }
            //转换List集合---->字符串
            else{
                for(int i=0;i<lis.size();i++){
                    //检测list<Object[]>中的object对象的长度
                    for(int j=0;j<lis.get(i).length;j++){
                        str+=lis.get(i)[j]+"[&]";
                    }
    
                    str+="[^]";
                }
                SharedPreferences.Editor editor=sp1.edit();
                editor.putString(keyStr,str);
    
                editor.commit();
            }
        }
    
        public List<Object[]> getData(){
            List<Object[]> li1=new ArrayList<>();
    
            String s=sp1.getString(keyStr,"404");
            if(s.equals("404")){
                Log.e("读取出错","404");
                return li1;
            }
            //字符串---->List集合
            else{
                String data1[]=s.split("\[\^\]");
                for(int i=0;i<data1.length;i++){
                    String da1[]=data1[i].split("\[\&\]");
                    int num=da1.length;
                        obj = new Object[num];
                    for(int j=0;j<num;j++){
                        obj[j]=da1[j];
                    }
                    li1.add(obj);
                }
                return li1;
            }
    
    
        }
    }

    2:调用该类

    ListOrStrTools listOrStrTools = new ListOrStrTools(this, "info", "li1");//参数分别是:this(本类上下文),模拟数据库名字,表名。想当于
    
    sp1 = context.getSharedPreferences(spStr,0);

     List<Object[]> li = new ArrayList<>();
            for (int i = 0; i < 3; i++) {
                objects = new Object[4];
                objects[0] = i;
                objects[1] = "11";
                objects[2] = "22";
                objects[3] = "333";
                li.add(objects);
            }
    
            ListOrStrTools listOrStrTools = new ListOrStrTools(this, "info", "li1");
            listOrStrTools.setData(li);
            List<Object[]> list1 = listOrStrTools.getData();//取出数据,并返回一个list集合。
            Log.e("ssss", list1.get(0)[3] + "");
            for (int i = 0; i < list1.size(); i++) {//打印存入的集合
                for (int j = 0; j < list1.get(i).length; j++) {
                    Log.e("sss", list1.get(i)[j] + "");
                }
            }

    结果成功取出

    方法二:

    利用gson这个依赖把字符串或者list转成json字符串格式存入sp中,然后操作的时候也是用sp拿出刚才存入的json字符串,修过之后再存入,麻烦归麻烦,封装成方法,麻烦一次终身受益。

    添加依赖 app->build.gradle

    implementation 'com.google.code.gson:gson:2.8.1'//compile(studio3.0之前)和implementation(3.0之后)

    数据转成JSON字符串

     UserBean userBean;
            List<UserBean> list = new ArrayList<>();
            for(int i=0;i<3;i++){
                userBean = new UserBean();
                userBean.setAge(10);
                userBean.setName("小王");
                list.add(userBean);
            }
            Gson gson=new Gson();
            String listStr = gson.toJson(list);

    把结构listStr存入sp。

    取出数据(List集合)

    先看源码,传入一个JSON字符串,第二个参数要求是什么类型,可以是list集合,泛型等。

    public <T> T fromJson(String json, Type typeOfT) throws JsonSyntaxException {
        if (json == null) {
          return null;
        }
        StringReader reader = new StringReader(json);
        T target = (T) fromJson(reader, typeOfT);
        return target;
      }

    取出

            List<UserBean> lis = gson.fromJson(listStr,new TypeToken<List<UserBean>>(){}.getType());
  • 相关阅读:
    android:gravity="center_vertical" 小注意
    架构设计:系统间通信(2)——概述从“聊天”开始下篇
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_autowire
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_tx
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_TransactionProxyFactoryBean
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_Transactional
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_SimpleCache
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_MethodCache
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_key
    吴裕雄--天生自然轻量级JAVA EE企业应用开发Struts2Sping4Hibernate整合开发学习笔记:Spring_EhCache
  • 原文地址:https://www.cnblogs.com/cmusketeer/p/8016537.html
Copyright © 2011-2022 走看看