关于SharedPreferences 保存list数据到持久层

这个问题我是我在项目中遇到的问题,在手机网络不好的情况下,需要对上传不上去的数据或照片进行保存,等网络好的情况下 继续上传;当时我想的解决办法就是先把上传不上去的数据 都封装成一个类,放到list里然后保存到SharedPreferences里,但是SharedPreferences不支持保存对象,所以我想能不能用流的方式存储;这个办法我花了很长时间去时间,也在网上找了好久,一下是我整理的代码,希望能帮助有需要的:

 List<Object> cache = new ArrayList<Object>(); //这是要保存的数据

List<Object> read = new ArrayList<Object>();//从数据层读取数据

把Object替换成你的封装类就行

public void saveData() {/ /保存
SharedPreferences preferences = getSharedPreferences("base64",
MODE_PRIVATE);
for (int i = 0; i < cache.size(); i++) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();// 创建字节输出流
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);// 创建对象输出流,并封装字节流
oos.writeObject(cache.get(i));// 取出对象写入字节流
String productBase64 = new String(Base64.encodeBase64(baos
.toByteArray()));// 将字节流编码成base64的字符串
Editor editor = preferences.edit();
editor.putString("data" + i, productBase64);
editor.commit();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

这里需要对保存的list大小做下保存,方便循环取出保存的封装类,这个大小一堆要与要保存的list大小一致,否则会抛空指针
public void readProduct() {// 读取
if (read_unupload!=null) {
read_unupload.clear();
}
SharedPreferences preferences = getSharedPreferences("base64",
MODE_PRIVATE);
int size=0;
if (!preferences.getString("size", "").equals("")) {//这是保存的那个list的size
size = Integer.parseInt(preferences.getString("size", ""));
}
for (int i = 0; i < size; i++) {
String productBase64 = preferences.getString("unUploadPhoto" + i, "");
if (productBase64 == "") {
return;
} else {
byte[] base64 = Base64.decodeBase64(productBase64.getBytes());// 读取字节
ByteArrayInputStream bais = new ByteArrayInputStream(base64);// 封装到字节流
try {
ObjectInputStream bis = new ObjectInputStream(bais);// 再次封装
try {
object= (Object) bis.readObject();// 读取对象
read.add(object);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

ok,以上就是我整理的代码,其实也没多复杂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值