数据存储(一)--SharedPreferences之你不知道的事

一、SharedPreferences将数据文件保存在指定路径上

SharedPreferences原则上是仅仅能保存在当前应用程序私有的shared_prefs文件夹中,只是也不是绝对的,我们能够用一些非常规的方法改变存储文件夹,反射技术是非常好的选择。

先上实现代码:

private  SharedPreferences share;
private  SharedPreferences.Editor editor;

改动路径关键代码:

private void initSharedPreferences(String path,String name,int mode)
	{
		try {
	 		Field field =ContextWrapper.class.getDeclaredField("mBase");
			field.setAccessible(true);
			Object obj = field.get(this);
			field = obj.getClass().getDeclaredField("mPreferencesDir");
			field.setAccessible(true);
			File file = new File(path);
			field.set(obj, file);
			share = getSharedPreferences(name, mode);
			editor = share.edit();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
Field field =ContextWrapper.class.getDeclaredField("mBase");

获取ContextWrapper对象中的mBase变量,该变量保存了ContextImpl对象,ContextImpl对象中的mPreferencesDir保存了数据文件的保存路径。

share = getSharedPreferences(name, mode);

运行这句后会在指定文件夹下创建文件用来保存数据。

PS:使用反射技术,要求细致研究源代码,这样才会知道要去改动哪个地方,哪个变量。

使用:

		initSharedPreferences("/data/fly","config",Activity.MODE_PRIVATE);
		editor.putString("AA", "AAaa");
		editor.commit();
		Toast.makeText(this, share.getString("AA", ""), 1000).show();

二、SharedPreferences保存图片

SharedPreferences原则上仅仅能将字符串以key-value的形式保存,可是我们能够採用编码的方式将不论什么二进制数据转化为字符串。从而将能够将二进制数据保存在SharedPreferences文件里。最经常使用的编码格式是Base64.

private void saveDrawable(int id)
    {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.JPEG, 50, baos);
        String imageBase64 = new String(Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT));
        editor.putString("P",imageBase64 );
        editor.commit();
    }

    private Drawable loadDrawable()
    {
        String temp = share.getString("P", "");
        ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));
        return Drawable.createFromStream(bais, "");
    }

三、SharedPreferences保存对象

因为二进制数据经过编码后能够用SharedPreferences以字符串的形式存储。所以保存对象也称为可能。

private void saveProduct(Product product)
	{
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try {
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(product);
			String temp = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
			Log.i("AAA", temp);
			editor.putString("product", temp);
			editor.commit();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private Product getProduct()
	{
		String temp = share.getString("product", "");
		ByteArrayInputStream bais =  new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));
		Product product = null;
		try {
			ObjectInputStream ois = new ObjectInputStream(bais);
			product = (Product) ois.readObject();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			Log.i("AAA", e.toString());
		}catch(ClassNotFoundException e1)
		{
			Log.i("AAA", e1.toString());
		}
		return product;
	}

对象能够被SharedPreferences存储的前提是该对象被序列化了,也就是说要实现Serializable接口,实际上Serializable接口是个空接口,仅仅是为了标记该对象是被序列化的。

public static class Product implements Serializable
	{
		String name;
		String id;
		int count;
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getId() {
			return id;
		}
		public void setId(String id) {
			this.id = id;
		}
		public int getCount() {
			return count;
		}
		public void setCount(int count) {
			this.count = count;
		}

		public String toString()
		{
			return "name:"+name+" id:"+id+" count:"+count;
		}

	}

假设该类是内部类的话要写成static 不然会出现java.io.NotSerializableException异常:解决的方法点这里

时间: 2024-10-23 10:08:25

数据存储(一)--SharedPreferences之你不知道的事的相关文章

Android 数据存储之 SharedPreferences储存

------------------------------------------SharedPreferences存储-------------------------------------------- SharedPreferences 使用键值对方式来存储数据的.当保存一条数据的时候,需要给这条数据提供一个对应的键,这样在读取数据的时候就可以通过这个键把相应的值取出. SharedPreferences 支持多种不同数据类型的存储,可以按照需要取出数值型,或者字符型的数据. ----

Android数据存储-通过SharedPreferences实现记住密码的操作

在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过SharedPreferences实现记住密码的操作 一.首先:介绍下什么是SharedPreferences? SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置. 二.介绍了SharedPreferences,我们将通过记住SharedPrefe

Android开发手记(16) 数据存储一 SharedPreferences

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据.这类似于C++中Map的数据存储方式(实际上在最后生成的.xml文件内,就是以Map格式存储的). 获取SharedPreferences的两种方式: 1.调用Context对象的getSharedPreferences()方法 2.调用Activity对象的getPrefer

处女男学Android(十三)---Android 轻量级数据存储之SharedPreferences

一.前言 转载请标明出处:http://blog.csdn.net/wlwlwlwl015/article/details/42437007 初学Android的时候在Activity之间传值我都是用Intent+Bundle这种模式去实现的,刚开始觉得没什么,后来渐渐发现了弊端,就是说只能逐层传递,当我的好几个Activity都需要从一个Activity中取数据的时候,这样就显得相当局限了,传来传去的即麻烦,又不合理,后来就想在Android中有没有web开发中类似于Session的东西,只要

Android数据存储之SharedPreferences存储

安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布尔型等.这些配置最后会保存在一个XML文件中,每次打开应用时,这些保存的信息就会被加载进来,我们也可以在“管理应用程序”中将这些缓存数据清除. SharedPreferences接口的常用方法如下: SharedPreferences接口类方法 No 方法 类型 描述 1 public abstra

Android数据存储之SharedPreferences

SharedPreferences是一种轻型的数据存储方式,基于XML文件存储key-value pairs键值对数据,通常用来存储一些简单的配置信息.SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现.每一个 SharedPreferences 文件都是由framework管理的并且可以是私有或者可共享的. 数据存储 新建一个Android项目,在MainActivity的onCreate方法中,调用getSharedPreferenc

Base-Android快速开发框架(二)--数据存储之SharedPreferences

对于Android开发者来说,抽象来说,其实就是将数据应各种各样的方式展示在用户面前以及采集用户的数据.采集用户的数据包括用户的输入.触摸.传感器等,展示的数据通过网络来源于各业务系统,以及用户的 输入数据.在这个过程中,数据存储显得由为重要.这也是我做为开端讲解的目的.良好的运用数据存储,不仅的能有效减少范围服务器的次数.用户的流量,还能加快Apps的响应速度,甚至简化应用的业务逻辑.数据 存储这一块将介绍常用的2种数据缓存方式,由Android SharedPreferences文件数据存储

Android成长日记-数据存储之SharedPreferences

数据篇-SharedPreferences Android的四种存储方式 1. SharedPreferences 2. SQLite 3. Content Provider 4. File ------------------------------华丽分割线---------------------------- SharedPreference: 1. 是一种轻型的数据存储方式 2. 本质是基于XML文件存储Key-Value键值对数据 3. 通常用来存储一些简单的配置信息 -------

Android数据存储之SharedPreferences浅析

SharedPreferences 是 Android 数据存储方式中的一种,特别适合用来存储少量的.格式简单的数据,比如应用程序的各种配置信息,如是否打开音效,是否开启震动等等. SharedPreferences 存储数据的位置和格式 SharedPreferences 将数据以键值对的形式,存储在 /data/data/<package name>/shared_prefs 目录下面,以 XML 的格式保存,该 XML 文件的根元素是 <map.../>,该元素里每个子元素代