android SharedPreferences 存储对象

介绍SharedPreferences工具类对简单和复杂对象的存储

对于复杂的对象存储android sdk本身没有提供相关api,如果想通过xml节点表示复杂对象在解析这块花的功夫就比较大了,于是找到一个简单方法,那就是用base64存储序列化的对象按string类型存储你懂的。 
一下是我在项目中用到的实测过的代码:
?
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
  * 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> T getValue(String key, Class<T> 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> T getObject(String key, Class<T> 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> T getValue(String key, Class<T> 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 ;
     }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值