Android SharedPreferences复杂的存储
我们知道SharedPreferences简单类型的数据。比如。String、int等。
假设想用SharedPreferences存取更复杂的数据类型(类、图像等),就须要对这些数据进行编码。
我们一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在
XML文件里。
Android SDK中并未提供Base64编码和解码库。
因此,须要使用第三方的jar包。
在本例中使用了Apache Commons组件集中的Codec组件进行Base64编码和解码。读者能够从例如以下的地址下载Codec组件的安装包。
在Androidproject文件夹的lib子文件夹中已经包括了Codec组件的jar包(commons-codec-1.4.jar)。因此,读者能够在该project中直接使用Codec组件。
在本例中将一个Product类的对象实例和一个图像保存在XML文件里,并在程序又一次执行后从XML文件装载Product对象和图像。
以下是Product类的代码:
java代码:
package eoe.mobile; import java.io.Serializable;
// 须要序列化的类必须实现Serializable接口
public class Product implements Serializable{
private String id;
private String name;
private float price;<span style="font-family:Microsoft Yahei, Tahoma, Simsun;color:#444444;"><span style="font-size: 14px; font-weight: 700; line-height: 21px;">
</span></span>
在存取数据之前。须要使用以下的代码创建一个SharedPreferences对象。
mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);当中mySharedPreferences是在类中定义的SharedPreferences类型变量。
在保存Product对象之前,须要创建Product对象,并将对应组件中的值赋给Product类的对应属性。将Product对象保存在XML文件里的代码例如以下:
java代码:
Product product = new Product();
product.setId(etProductID.getText().toString());
product.setName(etProductName.getText().toString());
product.setPrice(Float.parseFloat(etProductPrice.getText().toString()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
// 将Product对象放到OutputStream中
oos.writeObject(product);
mySharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);
// 将Product对象转换成byte数组,并将其进行base64编码
String productBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
SharedPreferences.Editor editor = mySharedPreferences.edit();
// 将编码后的字符串写到base64.xml文件里
editor.putString("product", productBase64);
editor.commit();
保存图像的方法与保存Product对象的方法类似。因为在保存之前,须要选择一个图像,并将该图像显示在ImageView组件中,因此。从ImageView组件中能够直接获得要保存的图像。
将图象保存在XML文件里的代码例如以下:
java代码:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 将ImageView组件中的图像压缩成JPEG格式,并将压缩结果保存在ByteArrayOutputStream对象中
((BitmapDrawable) imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos);
String imageBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
// 保存由图像字节流转换成的Base64格式字符串
editor.putString("productImage", imageBase64);
editor.commit();
当中compress方法的第2个參数表示压缩质量,取值范围是0至100,0表示最高压缩比,但图像效果最差,100则恰恰相反。
在本例中取了一个中间值50。
从XML文件里装载Product对象和图像是保存的逆过程。
也就是从XML文件里读取Base64格式的字符串,然后将其解码成字节数组。最后将字节数组转换成Product和Drawable对象。装载Product对象的代码例如以下:
java代码:
String productBase64 = mySharedPreferences.getString("product", "");
// 对Base64格式的字符串进行解码
byte[] base64Bytes = Base64.decodeBase64(productBase64.getBytes());
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
// 从ObjectInputStream中读取Product对象
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;">
</span></span>
装载图像的代码例如以下:
java代码:
String imageBase64 = mySharedPreferences.getString("productImage","");
base64Bytes = Base64.decodeBase64(imageBase64.getBytes());
bais = new ByteArrayInputStream(base64Bytes);
// 在ImageView组件上显示图像
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;">
</span></span>
在上面的代码中使用了Drawable类的createFromStream方法直接从流创建了Drawable对象,并使用setImageDrawable图像显示的在该方法中ImageView部件。
版权声明:本文博主原创文章。博客,未经同意,不得转载。
Android SharedPreferences复杂的存储的更多相关文章
- Android入门(九)文件存储与SharedPreferences存储
原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然, ...
- Android成长日记-数据存储之SharedPreferences
数据篇-SharedPreferences Android的四种存储方式 1. SharedPreferences 2. SQLite 3. Content Provider 4. File ---- ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据
SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...
- Android中的数据存储(一):SharedPreferences 2017-05-24 10:35 64人阅读 评论(1) 收藏
SharedPreferences 这是本人(菜鸟)学习android数据存储时接触的有关SharedPreferences的知识以及本人自己写的一个简单地demo,为初学者学习和使用SharedPr ...
- Android SharedPreferences(数据存储,需掌握)
1.SharePrefences类介绍 SharedPreferences 类提供了一个通用框架,以便您能够保存和检索原始数据类型的永久性键值对. 您可以使用 SharedPreferences 来保 ...
- Android SharedPreferences存储数据
SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...
- Android笔记(三十八) Android中的数据存储——SharedPreferences
SharedPreferences是Android提供的一种轻型的数据存储方法,其本质是基于xml文件存储的,内部数据以key-value的方式存储,通常用来存储一些简单的配置信息. SharedPr ...
- 67.Android中的数据存储总结
转载:http://mp.weixin.qq.com/s?__biz=MzIzMjE1Njg4Mw==&mid=2650117688&idx=1&sn=d6c73f9f04d0 ...
随机推荐
- hdu2102(bfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 分析:bfs求最短时间到达'P'点,不过本题有好几个trick,我都踩到了,自己还是太嫩了... ...
- 抽出SqlHelper
什么叫SqlHelper,通过简单的翻译,能够获得这是对Sql的帮助,那么它究竟对我们的Sql做出了什么样的帮助呢? 在一款软件的设计编程中,总是会对数据库有连接的.假设你用的是SqlServer的数 ...
- 最锋利的Visual Studio Web开发工具扩展:Web Essentials详解
原文:最锋利的Visual Studio Web开发工具扩展:Web Essentials详解 Web Essentials是目前为止见过的最好用的VS扩展工具了,具体功能请待我一一道来. 首先,从E ...
- LVS+Keepalived实现高可用负载均衡(转)
LVS+Keepalived实现高可用负载均衡 一.原理 1.概要介绍 如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具 ...
- Android 通过调用系统,如接口 谷歌语音、百度语音、科大讯飞语音等语音识别方法对话框
现在app在发展过程中会集成一些语音识别功能,不具有其自己的显影剂一般正在开发的语音识别引擎,所以在大多数情况下,它是选择一个成熟的语音识别引擎SDK集成到他们的app在. 平时,这种整合被分成两个, ...
- JAVA 读取图片储存至本地
需求:serlvet经过处理通过报表工具返回一张报表图(柱状图 折线图). 现在需要把这个图存储到本地 以便随时查看 // 构造URL URL url = new URL(endStr); // 打开 ...
- 伪教练技术培训之殇-2013年9月江西IDC拓行榜与综述
纠集几个人,然后培训所谓的教练技术培训. 培训的人一期又一期的参与,国学.佛学.超能量,无所不用其极,然后就是疯狂的拿人头,邀请朋友加盟. 有甚者还披上“科技”的外衣,用“水知道答案”这种早被公知指出 ...
- HDU5015 233 Matrix(矩阵高速幂)
HDU5015 233 Matrix(矩阵高速幂) 题目链接 题目大意: 给出n∗m矩阵,给出第一行a01, a02, a03 ...a0m (各自是233, 2333, 23333...), 再给定 ...
- POJ3190 Stall Reservations 【贪婪】
Stall Reservations Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3106 Accepted: 111 ...
- SQL Server :理解IAM 页
原文:SQL Server :理解IAM 页 在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. ...