使用SharedPreference 进行对象存储
2017-07-07 本文已影响16人
mm_cuckoo
使用场景
在实际开发中,经常会需要将对象进行存储,通常的想法是使用数据库进存储,但是,在整个项目中只需要对少量数据进行存储时,这时使用数据库就显得有些重。比如登录成功后的用户信息,在整个项目中只有这一条数据需要存储,如果因为这一条数据的存储就使用数据库进行存储,是否显得有些大材小用了,其实,使用SharedPreference 对用户登录信息进行存储,也不为是一种不错的选择,如果此时考虑写入和读取效率问题,可以对数在内存中做一下数据持久化处理。
注意
存入的对象一定要进行序列化(Serializable),否则无法进行存储
比如存入User对象,就要对User 进行序列化操作。
示例代码如下:
public class User implements Serializable{
private String name;
private String addr;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
实现代码
对象存储
/**
* 向SharedPreference 中保存信息<br>
*
* @param key
* 类型String Key
* @param obj
* 类型object
*/
public void saveToShared(String key, Object obj) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
try {
ObjectOutputStream oout = new ObjectOutputStream(out);
oout.writeObject(obj);
String value = new String(Base64.encode(out.toByteArray()));
Editor editor = sharedPreferences.edit();
editor.putString(key,value);
editor.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
对象读取
/**
* 从SharedPreference 中读取保存的信息<br>
*
* @param key
* 读取保存信息的Key
* @return 返回读取的信息<br>
* 类型为 T <br>
* Value 为读取内容,类型为String,如果Key未找到对应的数据,则返回null
*/
public Object queryForSharedToObject(String key) {
String value = sharedPreferences.getString(key, null);
if(value != null){
byte[] valueBytes = Base64.decode(value);
ByteArrayInputStream bin = new ByteArrayInputStream(valueBytes);
try {
ObjectInputStream oin = new ObjectInputStream(bin);
return oin.readObject();
} catch (Exception e) {
return null;
}
}
return null;
}