Android SharedPreferences复杂存储

转载 2016年08月31日 13:00:02
  我们知道SharedPreferences只能保存简单类型的数据,例如,String、int等。如果想用SharedPreferences存取更复杂的数据类型(类、图像等),就需要对这些数据进行编码。我们通常会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中。

       Android SDK中并未提供Base64编码和解码库。因此,需要使用第三方的jar包。在本例中使用了Apache Commons组件集中的Codec组件进行Base64编码和解码。读者可以从如下的地址下载Codec组件的安装包。

       在Android工程目录的lib子目录中已经包含了Codec组件的jar包(commons-codec-1.4.jar),因此,读者可以在该工程中直接使用Codec组件。

       在本例中将一个Product类的对象实例和一个图像保存在XML文件中,并在程序重新运行后从XML文件装载Product对象和图像。下面是Product类的代码: 

java代码:
  1. package eoe.mobile;  
  2.   
  3.   
  4. import java.io.Serializable;  
  5. // 需要序列化的类必须实现Serializable接口  
  6. public class Product implements Serializable{  
  7. private String id;  
  8. private String name;  
  9. private float price;<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">  
  10. </span></span>  


       在存取数据之前,需要使用下面的代码创建一个SharedPreferences对象。

       mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);其中mySharedPreferences是在类中定义的SharedPreferences类型变量。在保存Product对象之前,需要创建Product对象,并将相应组件中的值赋给Product类的相应属性。将Product对象保存在XML文件中的代码如下:

java代码:
  1. Product product = new Product();  
  2. product.setId(etProductID.getText().toString());  
  3. product.setName(etProductName.getText().toString());  
  4. product.setPrice(Float.parseFloat(etProductPrice.getText().toString()));  
  5. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  6. ObjectOutputStream oos = new ObjectOutputStream(baos);  
  7. // 将Product对象放到OutputStream中  
  8. oos.writeObject(product);  
  9. mySharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);  
  10. // 将Product对象转换成byte数组,并将其进行base64编码  
  11. String productBase64 = new String(Base64.encodeBase64(baos.toByteArray()));  
  12. SharedPreferences.Editor editor = mySharedPreferences.edit();  
  13. // 将编码后的字符串写到base64.xml文件中  
  14. editor.putString("product", productBase64);  
  15. editor.commit();  


        保存图像的方法与保存Product对象的方法类似。由于在保存之前,需要选择一个图像,并将该图像显示在ImageView组件中,因此,从ImageView组件中可以直接获得要保存的图像。将图象保存在XML文件中的代码如下:

Java代码:

  1. ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  2. // 将ImageView组件中的图像压缩成JPEG格式,并将压缩结果保存在ByteArrayOutputStream对象中  
  3. ((BitmapDrawable) imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos);  
  4. String imageBase64 = new String(Base64.encodeBase64(baos.toByteArray()));  
  5. // 保存由图像字节流转换成的Base64格式字符串  
  6. editor.putString("productImage", imageBase64);  
  7. editor.commit();  


        其中compress方法的第2个参数表示压缩质量,取值范围是0至100,0表示最高压缩比,但图像效果最差,100则恰恰相反。在本例中取了一个中间值50。

       从XML文件中装载Product对象和图像是保存的逆过程。也就是从XML文件中读取Base64格式的字符串,然后将其解码成字节数组,最后将字节数组转换成Product和Drawable对象。装载Product对象的代码如下:

java代码:

  1. String productBase64 = mySharedPreferences.getString("product""");  
  2. // 对Base64格式的字符串进行解码  
  3. byte[] base64Bytes = Base64.decodeBase64(productBase64.getBytes());  
  4. ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);  
  5. ObjectInputStream ois = new ObjectInputStream(bais);  
  6. // 从ObjectInputStream中读取Product对象  
  7. Product product = (Product) ois.readObject();<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">  
  8. </span></span>  



装载图像的代码如下:

java代码:

  1. String imageBase64 = mySharedPreferences.getString("productImage","");  
  2. base64Bytes = Base64.decodeBase64(imageBase64.getBytes());  
  3. bais = new ByteArrayInputStream(base64Bytes);  
  4. // 在ImageView组件上显示图像  
  5. imageView.setImageDrawable(Drawable.createFromStream(bais,"product_image"));<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">  
  6. </span></span>  



        在上面的代码中使用了Drawable类的createFromStream方法直接从流创建了Drawable对象,并使用setImageDrawable方法将图像显示在ImageView组件上。
0
0

Android的移动存储之SharedPreferences <可保存复杂数据>

在Android系统中提供了多种存储技术.通过这些存储技术可以将数据存储在各种存储介质上.比如sharedpreferences可以将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据...

通过SharedPreferences方式存储复杂数据

   我们可以通过SharedPreferences方式存储一些复杂的数据,如图片或类的存储,(当然,建议不要用这种方式存储)下面我们通过代码来学习:    @Override    public v...

android框架搭建——封装一个属于自己的数据存储工具类(sharedPreferences篇)

之前的几篇博文中提到过封装网络工具类,那么在发送请求并获取一个JSONObject对象之后,如何便捷的进行json解析和数据存储便成了我们要考虑的问题,在此分享一下自己在使用了诸多工具之后的一点心得。...

Android——配置文件的保存SharedPreferences进行数据存储

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android SharedPreferences复杂存储
举报原因:
原因补充:

(最多只允许输入30个字)