如果要用 SharedPreferences 存取复杂的数据类型(类,图像等),就需要对这些数据进行编码。通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在XML文件中。
一、SharedPreferences存储对象
1、创建要存储的实体类对象(要序列化)
public class Student implements Serializable{
private String name;
private String age;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
2、存储对象
SharedPreferences sharedPreferences = getSharedPreferences("student", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Student student = new Student();
student.setName("谁是谁");
student.setAge("23");
student.setAddress("水泥星");
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(student);
String base64Student = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT);
editor.putString("student", base64Student);
editor.apply();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
3、取对象
SharedPreferences sharedPreferences = getSharedPreferences("student", MODE_PRIVATE);
String studentString = sharedPreferences.getString("student", "");
byte[] base64Student = Base64.decode(studentString, Base64.DEFAULT);
ByteArrayInputStream bais = new ByteArrayInputStream(base64Student);
try {
ObjectInputStream ois = new ObjectInputStream(bais);
Student student = (Student) ois.readObject();
Log.e("------------->", "" + student.getAddress() + student.getAge() + student.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
二、SharedPreferences保存图片
1、存
SharedPreferences sharedPreferences = getSharedPreferences("student", MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
ByteArrayOutputStream baos2 = new ByteArrayOutputStream();
((BitmapDrawable) getResources().getDrawable(R.drawable.lanbojini)).getBitmap().compress(Bitmap.CompressFormat.JPEG, 100, baos2);
String imageBase64 = Base64.encodeToString(baos2.toByteArray(), Base64.DEFAULT);
editor.putString("productImg", imageBase64);
editor.commit();
2、取
iv_prod_img = (ImageView) findViewById(R.id.iv_prod_img);
byte[] imagByte = Base64.decode(sharedPreferences.getString("productImg",""), Base64.DEFAULT);
ByteArrayInputStream bais2 = new ByteArrayInputStream(imagByte);
iv_prod_img.setImageDrawable(Drawable.createFromStream(bais2, "imagByte"));