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,);
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());
SharedPreferences 存List集合,模拟数据库,随时存取的更多相关文章
- php模拟数据库常用操作效果
test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); ...
- MongoDB文档、集合、数据库简介
文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个有序集.MongoDB使用Javascript shell,文档的表 ...
- cache—主存—辅存三级调度模拟
近日,在体系结构的课程中,老师留了一个上机作业,为cache—主存—辅存三级调度模拟,要求如下: 实现三级存储体系的模拟调度程序 描述:CPU在cache访问数据块,若命中给出对应的cache实地址, ...
- JavaEE学习之Spring Security3.x——模拟数据库实现用户,权限,资源的管理
一.引言 因项目需要最近研究了下Spring Security3.x,并模拟数据库实现用户,权限,资源的管理. 二.准备 1.了解一些Spring MVC相关知识: 2.了解一些AOP相关知识: 3. ...
- laravel进行单元测试的时候如何模拟数据库以及mockery的调用
单元测试是独立的,所谓的独立是指有独立的运行容器,独立的数据库. 这样做有什么好处呢? (1). 不会跟正常的容器产生冲突,继而影响正常业务. (2). 数据库独立防止数据被修改影响单元测试结果. 这 ...
- C#将图片存放到SQL SERVER数据库中的方法
本文实例讲述了C#将图片存放到SQL SERVER数据库中的方法.分享给大家供大家参考.具体如下: 第一步: ? 1 2 3 4 5 6 7 8 9 10 //获取当前选择的图片 this.pictu ...
- MongoDB的文档、集合、数据库(二)
为了理解MongoDB的名词,可以将其于关系型数据库进行对比: 一.文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个 ...
- Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。
package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...
- MongoDB 学习笔记之 删除数据,集合,数据库
删除数据,集合,数据库: 删除一个文档: db.media.deleteOne({"name": "Sky"}) 删除多个文档: db.media.delete ...
随机推荐
- 《Linux命令行与shell脚本编程大全》第十七章 创建函数
可以将shell脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了. 17.1 基本的脚本函数 函数:是一个脚本代码块,可以为其命名并在代码中任何位置重用. 17.1.1 创建函数 有 ...
- netty源码分析
1.Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序.也就是说,Netty 是一个基于N ...
- ML笔记:Where does the error come from?
error来自哪? 来自于偏差Bias和方差Variance. 就如打靶时瞄准一个点f平均,打出的点f星分布在该点周围. 该点与实际靶心f帽的距离就是偏差Bias, 打出的点与该点的分布距离就是方差V ...
- hdu 1151 Air Raid DAG最小边覆盖 最大二分匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1151 题目大意: 城镇之间互相有边,但都是单向的,并且不会构成环,现在派伞兵降落去遍历城镇,问最少最少 ...
- (高级篇)php结合redis实现高并发下的抢购、秒杀功能
抢购.秒杀是如今很常见的一个应用场景,主要需要解决的问题有两个:1 高并发对数据库产生的压力2 竞争状态下如何解决库存的正确减少("超卖"问题)对于第一个问题,已经很容易想到用缓存 ...
- bootstrap-select多选下拉列表插件使用小记
下载插件 插件地址:http://silviomoreto.github.io/bootstrap-select/ 下载好后引用css和js文件 <!-- 因为是jquery插件,所以引用前先引 ...
- 05.haproxy+mysql负载均衡 整合 redis集群+ssm
本篇重点讲解haproxy+mysql负载均衡,搭建完成后与之前搭建的redis+ssm进行整合 (注:这里用到了两台mysql数据库,分别安装两台虚拟机上,已经成功实现主主复制,如果有需要,请查看我 ...
- 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机)
引言 在大数据学习系列之一 ----- Hadoop环境搭建(单机) 成功的搭建了Hadoop的环境,在大数据学习系列之二 ----- HBase环境搭建(单机)成功搭建了HBase的环境以及相关使用 ...
- css走过的坑
css盒模型 1.内联元素 设置宽高无效.margin左右有效上下无效.padding都有效 会被当做字体所以内联之间有间隙 父级元素要设置font-size:0; 内联元素:a.b.button.e ...
- 用shell制作IP脚本
vim ip.sh #!/bin/bashread -p "eth:" eread -p "ip:" ip1read -p "netmask:&qu ...