博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SharedPreferences存储复杂对象解决方案
阅读量:6447 次
发布时间:2019-06-23

本文共 4067 字,大约阅读时间需要 13 分钟。

  hot3.png

对于复杂的对象存储android sdk本身没有提供相关api,如果想通过xml节点表示复杂对象在解析这块花的功夫就比较大了,于是找到一个简单方法,那就是用base64存储序列化的对象按string类型存储你懂的。
一下是我在项目中用到的实测过的代码:
/** * SharedPreferences工具类 * * @author bobby * */public class SharedPreferencesUtils {    Context context;    String name;    public SharedPreferencesUtils(Context context, String name) {        this.context = context;        this.name = name;    }    /**     * 根据key和预期的value类型获取value的值     *     * @param key     * @param clazz     * @return     */    public 
T getValue(String key, Class
clazz) { if (context == null) { throw new RuntimeException("请先调用带有context,name参数的构造!"); } SharedPreferences sp = this.context.getSharedPreferences(this.name, Context.MODE_PRIVATE); return getValue(key, clazz, sp); } /** * 针对复杂类型存储
<对象>
* * @param key * @param val */ public void setObject(String key, Object object) { SharedPreferences sp = this.context.getSharedPreferences(this.name, Context.MODE_PRIVATE); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream out = null; try { out = new ObjectOutputStream(baos); out.writeObject(object); String objectVal = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT)); Editor editor = sp.edit(); editor.putString(key, objectVal); editor.commit(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (baos != null) { baos.close(); } if (out != null) { out.close(); } } catch (IOException e) { e.printStackTrace(); } } } @SuppressWarnings("unchecked") public
T getObject(String key, Class
clazz) { SharedPreferences sp = this.context.getSharedPreferences(this.name, Context.MODE_PRIVATE); if (sp.contains(key)) { String objectVal = sp.getString(key, null); byte[] buffer = Base64.decode(objectVal, Base64.DEFAULT); ByteArrayInputStream bais = new ByteArrayInputStream(buffer); ObjectInputStream ois = null; try { ois = new ObjectInputStream(bais); T t = (T) ois.readObject(); return t; } catch (StreamCorruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { if (bais != null) { bais.close(); } if (ois != null) { ois.close(); } } catch (IOException e) { e.printStackTrace(); } } } return null; } /** * 对于外部不可见的过渡方法 * * @param key * @param clazz * @param sp * @return */ @SuppressWarnings("unchecked") private
T getValue(String key, Class
clazz, SharedPreferences sp) { T t; try { t = clazz.newInstance(); if (t instanceof Integer) { return (T) Integer.valueOf(sp.getInt(key, 0)); } else if (t instanceof String) { return (T) sp.getString(key, ""); } else if (t instanceof Boolean) { return (T) Boolean.valueOf(sp.getBoolean(key, false)); } else if (t instanceof Long) { return (T) Long.valueOf(sp.getLong(key, 0L)); } else if (t instanceof Float) { return (T) Float.valueOf(sp.getFloat(key, 0L)); } } catch (InstantiationException e) { e.printStackTrace(); Log.e("system", "类型输入错误或者复杂类型无法解析[" + e.getMessage() + "]"); } catch (IllegalAccessException e) { e.printStackTrace(); Log.e("system", "类型输入错误或者复杂类型无法解析[" + e.getMessage() + "]"); } Log.e("system", "无法找到" + key + "对应的值"); return null; }}

转载于:https://my.oschina.net/ibobby/blog/311446

你可能感兴趣的文章
[JSOI2008]星球大战starwar BZOJ1015
查看>>
CountDownLatch与thread-join()的区别
查看>>
linux下MySQL安装登录及操作
查看>>
二项队列
查看>>
Nginx
查看>>
centos 7 部署LDAP服务
查看>>
揭秘马云帝国内幕:马云的野心有多大
查看>>
topcoder srm 680 div1
查看>>
算法专题(1)-信息学基本解题流程!
查看>>
模拟文件系统
查看>>
使用SSH连接Windows10 Ubuntu (WSL),Pycharm
查看>>
poj2155
查看>>
CSS动画之转换模块
查看>>
swift - UITextField 的用法
查看>>
检索和关闭游标+检索游标+关闭游标
查看>>
[开源]KJFramework.Message 智能二进制消息框架 -- 性能提升
查看>>
iOS项目分层
查看>>
CocosCreator 小知识
查看>>
如何称为演讲高手
查看>>
PHP坑之积累
查看>>