一、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异常:解决的方法点这里

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

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

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  2. Android 数据存储之 SharedPreferences储存

    ------------------------------------------SharedPreferences存储--------------------------------------- ...

  3. Android数据存储三剑客——SharedPreferences、File、SQLite

    Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...

  4. Android数据存储之SharedPreferences及如何安全存储

    前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...

  5. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  6. Android数据存储之SharedPreferences存储

    安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...

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

    数据篇-SharedPreferences Android的四种存储方式 1. SharedPreferences 2. SQLite 3. Content Provider 4. File ---- ...

  8. Android简易数据存储之SharedPreferences

    Andorid提供了多种数据存储的方式,例如前面说到的“Android数据存储之SQLite的操作”是用于较复杂的数据存储.然而,如果有些简单的数据存储如果采用SQLite的方式的话会显得比较笨重.例 ...

  9. android数据存储之SharedPreferences

    一.SharedPreferences简介      (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...

随机推荐

  1. 正确安装 django-socketio

    直接使用 pip 安装,连 example project 都运行不了... 要正常使用,关键是要使用正确版本的依赖包 Django (1.5.5) django-socketio (0.3.2) g ...

  2. Xcode6插件开发

    工欲善其事必先利其器,Xcode是我们做iOS Dev必须掌握的一款开发工具. Xcode本身也是一门Cocoa程序,与其来说它是一个Cocoa程序,是不是意味着,我们可以去动态去让它做某件事,或者监 ...

  3. C# Http POST get

    using System.IO;using System.Net; /// <summary>        /// HttpWebRequest发送Post请求     /// < ...

  4. 定制textField

    2014-08-05 11:00 447人阅读 评论(0) 收藏 举报  分类: IOS开发笔记(248)  版权声明:本CSDN博客所有文章不会即时更新,请关注个人博客:http://www.hua ...

  5. (转载)KL距离,Kullback-Leibler Divergence

    转自:KL距离,Kullback-Leibler Divergence   KL距离,是Kullback-Leibler差异(Kullback-Leibler Divergence)的简称,也叫做相对 ...

  6. [BZOJ 1733] [Usaco2005 feb] Secret Milking Machine 【二分 + 最大流】

    题目链接:BZOJ - 1733 题目分析 直接二分这个最大边的边权,然后用最大流判断是否可以有 T 的流量. 代码 #include <iostream> #include <cs ...

  7. VSFTP被动模式

    搞了几个弯路,各种办法都试了. 动静最小的,还是定义端口. 还有虚拟用户,配置太多,只适用于小范围吧.又要pam.d,又要chroot之类的,nologin也必不可少. ~~~~~~~~~ 限制被动模 ...

  8. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

  9. 《深度探索c++对象模型》chapter2 构造函数语义学

    关于c++,最常听到的一个抱怨是,编译器背着程序员做了太多事情,conversion运算符是最常被引用的一个例子:jerry schwarz,iostream函数库的建筑师,就曾经说过一个故事,他说他 ...

  10. 设计模式之(三)Proxy模式

    今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...