今天,简单讲讲Android如何使用SharedPreferences保存对象。

记得之前写过一遍博客关于android如何使用SharedPreferences保存List<String>类型的链表,但是最近需要做一个需求,保存一个对象或者是List<Object>,那么应该怎么办呢?在网上查找了资料,最终是解决了问题。这里记录一下。

一.使用Gosn将对象转成String后存入SharedPreferences

下面是我封装改账本(Book)的Bean:

package beans;/*** Created by Chase on 2017/5/3.*/public class BookBean {public String bookName;public int bookBgSrc;public BookBean(){}public BookBean(String bookName,int bookBgSrc){this.bookName = bookName;this.bookBgSrc =bookBgSrc;}public String getBookName(){return bookName;}public int getBookBgSrc(){return bookBgSrc;}public void setBookBgSrc(int bookBgSrc) {this.bookBgSrc = bookBgSrc;}public void setBookName(String bookName) {this.bookName = bookName;}
}

下面编写两个方法用来存储和读取这个Bean:

public class SpUtils {private static SharedPreferences sp;/*** 4.存储账本bookBean的list*/public static void putBookBean(Context ctx, List<BookBean> bookList) {if (sp == null) {sp = ctx.getSharedPreferences("config", MODE_PRIVATE);}SharedPreferences.Editor editor = sp.edit();Gson gson = new Gson();String json = gson.toJson(bookList);editor.putString(ConstantValue.BOOK_BEAN, json);editor.commit();}}
 /*** 读取账本bookBean的list*/public static List<BookBean> getBookBean(Context ctx) {if (sp == null) {sp = ctx.getSharedPreferences("config", MODE_PRIVATE);}Gson gson = new Gson();String json = sp.getString(ConstantValue.BOOK_BEAN, null);Type type = new TypeToken<List<BookBean>>() {}.getType();List<BookBean> arrayList = gson.fromJson(json, type);return arrayList;}

这个需要导入Gosn jar包,并且实体类需要满足gosn对于实体类的要求,具体的大家可以查找资料。

二.使用Base64将对象编码成String后存入SharedPreferences

由于二进制数据经过编码后可以用SharedPreferences以字符串的形式存储,所以保存对象也成为了可能,但是这个类必须是可序列化即implements Serializable(实际上Serializable接口是个空接口,只是为了标记该对象是被序列化的),然后可以通过ObjectOutputStream保存再转为二进制存储

1、保存序列化的对象

/*** @param user*/public static void saveUser(Context context, String preferenceName,String key,User user) throws Exception {if(user instanceof Serializable) {SharedPreferences sharedPreferences = context.getSharedPreferences(preferenceName, context.MODE_PRIVATE);SharedPreferences.Editor editor = sharedPreferences.edit();ByteArrayOutputStream baos = new ByteArrayOutputStream();try {ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(user);//把对象写到流里String temp = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));editor.putString(key, temp);editor.commit();} catch (IOException e) {e.printStackTrace();}}else {throw new Exception("User must implements Serializable");}}

2、读取序列化的对象

public static User getUser(Context context, String preferenceName,String key) {SharedPreferences sharedPreferences=context.getSharedPreferences(preferenceName,context.MODE_PRIVATE);String temp = sharedPreferences.getString(key, "");ByteArrayInputStream bais =  new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));User user = null;try {ObjectInputStream ois = new ObjectInputStream(bais);user = (User) ois.readObject();} catch (IOException e) {}catch(ClassNotFoundException e1) {}return user;}

当然Sharedpreferences也是可以存储各种集合类的比如说List,都可以通过转为ObjectOutputStream输出流进而编码存储

public static String listToString(List<?> list)throws IOException {// 实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件。ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// 然后将得到的字符数据装载到ObjectOutputStreamObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);// writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法可以还原它objectOutputStream.writeObject(list);// 最后,用Base64.encode将字节文件转换成Base64编码保存在String中String listString = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));// 关闭objectOutputStreamobjectOutputStream.close();return listString;}@SuppressWarnings("unchecked")public static List<?> StringToList(String listString) throws StreamCorruptedException, IOException,ClassNotFoundException {byte[] mobileBytes = Base64.decode(listString.getBytes(),Base64.DEFAULT);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);List<?> WeatherList = (List<?>) objectInputStream.readObject();objectInputStream.close();return WeatherList;}

这个我自己测试过,是可以正常使用的,不过实体类需要实现Serializable接口,而且效率可能比较低,这个大家可以去网上查找资料。



三、关于Base64

public static void main(String[] args) {  BASE64Encoder encoder = new BASE64Encoder();  String s = "Man";  String encoded = encoder.encode(s.getBytes());  System.out.println("ecoded Man " + encoded);  s = "Mo";  String encoded = encoder.encode(s.getBytes());  System.out.println("ecoded Mo" + encoded);s = "c";  String encoded = encoder.encode(s.getBytes());  System.out.println("ecoded c" + encoded);} 

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个比特为一个单元,对应某个可打印字符。三个字节有24个比特,对应于4个Base64单元,即3个字节可表示4个可打印字符。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Za-z0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。Base64是一种可逆的编码方式。最常见的表现就是在于可以用Base64对图片编码变成流,反过来也可以把流转为图片,Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email、在XML中存储复杂数据。
这是编码后的数据是一个字符串,其中包含的字符为:A-Za-z0-9+/共64个字符(其实是65个字符,而“=”是填充字符)。

当长度为3个字节的数据经过Base64编码后就变为4个字节,比如

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行base64的编码。在编码后的base64文本后加上一个或两个’=’号,代表补足的字节数。也就是说,当最后剩余一个八位字节(一个byte)时,最后一个6位的base64字节块有四位是0值,最后附加上两个等号;如果最后剩余两个八位字节(2个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。 参考下表:

android 使用SharedPreferences保存对象就讲完了。

就这么简单。



android 使用SharedPreferences保存对象相关推荐

  1. android 对象 保存,Android使用SharedPreferences保存对象

    核心原理: 对象序列化 步骤 1.要保存的对象实现序列化Serializable 2.将序列化的对象保存String(本文的做法是保存为byte数组在转为16进制的String类型保存起来) 3.将保 ...

  2. android 清空sp数据,Android 使用 SharedPreferences 保存少量数据的实现代码

    1 SharedPreferences 介绍 SharedPreferences是使用键值对的方式来存储数据的 SharedPreferences share = getSharedPreferenc ...

  3. android 屏幕关闭 eofexception,android EOFException异常解决办法 (SharedPreferences保存对象)...

    SharePreferences可以保存String 但是不能保存对象 这不符合面向对象. 为此可以通过序列化和反序列化将Serializable对象和字符串相互转化 所以可以将Serizlizabl ...

  4. Android使用SharedPreferences保存账号密码

    有很多的应用都会有保存密码和账号的功能,比如QQ.接下来就讲讲使用SharedPreferences来保存密码和账号,也许有些人会考虑的数据库,但是我个人认为对于保存简单的数据,使用的数据库就大材小用 ...

  5. SharedPreferences保存对象以及集合,腾讯MMKV使用,保存搜索历史

    腾讯MMKV使用 implementation 'com.tencent:mmkv-static:1.2.9' MMKV.initialize(this);//会返回MMVK存储的目录(String) ...

  6. android中如何保存对象集合中,如何序列化对象并将其保存到Android中的文件?

    沧海一幻觉 我只是用Generics创建了一个类来处理它,所以它可以用于所有可序列化的对象类型:public class SerializableManager { /** * Saves a ser ...

  7. Android SharedPreferences保存和读取对象

    SharedPreferences保存和读取对象 1.首先要序列化对象(以下是序列化实体类的样例,不方便贴出实体类全部的代码) public class LoginResult extends Bas ...

  8. android SharedPreferences 存储对象

    原文地址为: android SharedPreferences 存储对象 我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPre ...

  9. android sharedpreferences 存储对象,android中SharedPreferences实现存储用户名功能

    1. 简介 SharedPreferences是一种轻型的数据存储方式,通过key-value键值对的方式将数据存储在xml文件中,常用于存储简单的配置信息. 2. 使用方式 2.1 获取Shared ...

最新文章

  1. JS监听手机物理返回键,返回到指定页面
  2. 从语义(semantic)GIS和知识表达谈起
  3. WinDbg配置和使用基础
  4. 万字干货:教新手从0到1搭建完整的增长数据体系(30图)
  5. CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
  6. python守护进程windows_如何把 python predict程序 做成 windows 守护进程
  7. Android开发之ANR原因分析
  8. Android开发编码规范pdf文件下载
  9. JavaScript对SEO的影响及解决之道
  10. 不止代码:循环比赛(分治)
  11. java 文件下载,中文表名,中文内容
  12. OS: 读者写者问题(写者优先+LINUX+多线程+互斥量+代码)(转)
  13. 买的首套房开发商指定的银行是5.88的利率,朋友都说利率有点高,怎样才能省点钱呢?
  14. 新建的邮件服务器只能发件不能收件_49. Django 2.1.7 使用内置函数发送邮件
  15. 类似中国知网但是搜索英文文献的权威网站有哪些?
  16. 三角形的内切圆和外接圆半径公式
  17. projection theorem
  18. Ubuntu安装LXDE桌面环境
  19. 在c语言中保留字是有专门含义和作用的,c语言中的关键字和保留字的区别?
  20. python企业微信群聊_python3企业微信群组报警

热门文章

  1. SocketLog安装
  2. size()函数的使用
  3. 超全!整理常用的iOS第三方资源
  4. android137 360 双击三击事件
  5. 中国建设银行(2011.11.19南京大学)
  6. 【转贴】爱是莲花,最美的是清苦的莲心
  7. Vue (二) --- Vue对象提供的属性功能
  8. pyinstaller生成exe文件失败
  9. 【BZOJ4476】[Jsoi2015]送礼物 分数规划+RMQ
  10. 对付ajax ,配置selenium+phantonjs