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());
本文版权归作者所有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
分类:
Android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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)