随笔 - 64  文章 - 2  评论 - 84  阅读 - 19万

SharedPreferences 存List集合,模拟数据库,随时存取

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

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

 

1
2
3
4
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的长度是多少都行。(当然不能超过限制)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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());

 

posted on   TMusketeer  阅读(5624)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示