Android_数据存储——SharedPreferences

说明:该文中内容来自书《Android开发权威指南》,我通过整理,作为笔记。

SharedPreferences 的基本用法

1、保存简单数据

SharedPreferences是属于键值对形式,使用SharedPreferences保存key-value对的步骤如下:

(1)使用Activity。getSharedPreferences方法获得SharedPreferences对象。其中存储键值对的文件名称由getSharedPreferences方法的第一个参数指定。

(2)使用SharedPreferences.edit方法获得SharedPreferences.Editor对象。

(3)使用SharedPreferences.Editor.putXxx方法保存key-value对。

(4)通过SharedPreferences.Editor.commit方法保存key-value对。commit方法相当于数据库事务中的提交操作,只有在事务结束后进行提交,才会将数据真正保存在数据库中。

下面代码保存了两个键值对:

//获得SharedPreferences对象(第一步)
SharedPreferences sp_write = getSharedPreferences("test", Activity.MODE_PRIVATE);
//获得SharedPreferences.Editor对象(第二步)
SharedPreferences.Editor editor = sp_write.edit();
//使用pubXxx方法保存数据(第三步)
editor.putString("name", "李宁");
editor.putString("habit", "Android、协作、旅游");
//将数据保存在文件中(第四步)
editor.commit();
Toast toast = Toast.makeText(this, "写数据成功", Toast.LENGTH_LONG);
toast.show();

读取这两个键值对的代码如下:

SharedPreferences sp_read = getSharedPreferences("test", Activity.MODE_PRIVATE);
String name = sp_read.getString("name", "");
String habit = sp_read.getString("habit", "");
Toast.makeText(this, "name:"+name+"\n"+"habit:"+habit, Toast.LENGTH_LONG).show();

实际上,SharedPreferences将数据文件写在手机内存(Rom)私有的目录中。在模拟中测试程序,可以通过DDMS透视图,静如“File Explorer”视图,找到data/data目录,通过相应的包名找到对应的文件。

2、保存复杂数据

SharedPreferences保存复杂数据,如图片,对象时,需要对这些复杂数据进行编码。通常会将复杂数据转换成Base64格式的编码,然后将转换后的数据以字符串的形式保存在xml文件中。

如下代码是保存图片:

try
		{
			SharedPreferences sp_store_image = getSharedPreferences("base64",
					Activity.MODE_PRIVATE);
			SharedPreferences.Editor editor = sp_store_image.edit();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			// 读取和压缩图片,并将其压缩结果保存在ByteArrayOutputStream对象中
			BitmapFactory.decodeResource(getResources(), R.drawable.flower)
					.compress(CompressFormat.JPEG, 50, baos);
			// 对压缩后的字节进行base64编码
			String imageBase64 = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
			// 保存转换后的Base64格式字符
			editor.putString("image", imageBase64);
			editor.commit();

			baos.close();
		} catch (Exception e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

读取图片:

try
		{
			SharedPreferences sp_read_image = getSharedPreferences("base64", Activity.MODE_PRIVATE);
			//读取Base64格式的图像数据
			String imageString = sp_read_image.getString("image", "");
			//对Base64格式的字符串进行解码,还原成字节数组
			byte[] imageBytes = Base64.decode(imageString.getBytes(), Base64.DEFAULT);
			ByteArrayInputStream bais = new ByteArrayInputStream(imageBytes);
			ImageView imageView = (ImageView) findViewById(R.id.image);
			imageView.setImageDrawable(Drawable.createFromStream(bais, "imageaa"));
			bais.close();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

保存对象:

try
		{
			Product product = new Product();
			product.name = "android手机";
			product.price = 2400;
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			//将对象Product保存在ObjectOutputStream对象中
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(product);
			
			SharedPreferences sp_store_object = getSharedPreferences("base64", Activity.MODE_PRIVATE);
			SharedPreferences.Editor editor = sp_store_object.edit();
			//将对象Product转换成byte数组,将其进行base64编码
			String productBase64 = new String (Base64.encode(baos.toByteArray(), Base64.DEFAULT));
			//编码后的字符串保存在base64.xml文件中
			editor.putString("product", productBase64);
			editor.commit();
			baos.close();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

读取对象:

try
		{
			SharedPreferences sp_read_object = getSharedPreferences("base64", Activity.MODE_PRIVATE);
			//从base64.xml文件中读取Product对象的base64格式字符串
			String base64Product = sp_read_object.getString("product", "");
			//将base64格式字符串还原成byte数组
			byte[] productBytes = Base64.decode(base64Product.getBytes(), Base64.DEFAULT);
			ByteArrayInputStream bais = new ByteArrayInputStream(productBytes);
			ObjectInputStream ois = new ObjectInputStream(bais);
			//将byte数组转换成product对象
			Product product = (Product) ois.readObject();
			Toast.makeText(this, "name:"+product.name+"\nprice:"+product.price, Toast.LENGTH_LONG).show();
			ois.close();
		} catch (StreamCorruptedException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (OptionalDataException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
效果图如下:

如需源代码:

下载链接:
http://download.csdn.net/detail/zlfxy/5096301

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值