Android SharedPreferences详解

来源:互联网 发布:淘宝付款显示系统异常 编辑:程序博客网 时间:2024/06/05 15:27

前言:由于太多的人没有真正的理解Android的轻量级存储SharedPreferences,所以这篇博客详细来说道说道这个SharedPreferences,让更多的人不仅学会用,而且懂得原理

首先上来一个很简单的例子


我们可以看到,在没有点击存储的时候,获取出来的是没有数值的,或者说获取出来的是一个默认值,下面贴一下代码

public class MainActivity extends Activity {// 轻量级存储对象private SharedPreferences sharedPreferences;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.act_main);// 获取到轻量级存储对象sharedPreferences = getSharedPreferences("data", MODE_PRIVATE);}// 存储字符串public void storeString(View v) {Editor edit = sharedPreferences.edit();edit.putString("str", "xiaojinzi");edit.commit();}// 获取字符串public void getString(View v) {String str = sharedPreferences.getString("str", "null");Toast.makeText(this, str, Toast.LENGTH_SHORT).show();}// 存储整型public void storeInt(View v) {Editor edit = sharedPreferences.edit();edit.putInt("int", 10);edit.commit();}// 获取整型public void getInt(View v) {int tmp = sharedPreferences.getInt("int", -1);Toast.makeText(this, tmp + "", Toast.LENGTH_SHORT).show();}}

代码很简单,四个按钮对应四个方法,功能我都写在注释上面了,大家一目十行的看一下,从上面的效果我们看到,没有存储字符串的时候获取出来的是一个null,点击存储之后获取出来就是"xiaojinzi",这也容易理解,因为数据都没有存储过,哪来的值让你获取,而获取的时候我们填写了一个默认值的参数,当获取失败或者没有这个key对应的值的时候就返回你填写的默认值

那我们现在看一下,数据到底是怎么存储的,于是我们前往数据存储的地方,拿出存储文件.

在我们的Android文件系统中,找到data->data->(app的包名)


我们可以看到有一个shared_prefs文件夹,从名字可以轻易的看出来这个文件夹就是存储数据,但是为什么是一个文件夹呢?

这个很好理解,因为有时候数据种类多了,app的功能也多了,各个模块可能会用到同一个key,但是作用却不同,所以这时候我们可以使用同一个key在两个或者多个文件中,这样子就没有问题了,我们延时的app中就用到一个数据文件

存储数据的文件是data.xml,这个文件名字是哪里来的,仔细看我上面贴的代码,在oncreate方法中我们获取SharedPreferences的时候第一个参数就是文件名字.

我们导出来然后打开看一下


其实存储数据的就是一个xml文件,第一行是xml的头,指定一些参数,xml的版本,使用的编码方式等等

然后下面是重点,有一个根节点<map></map>,然后下面的所有标签都是在<map></map>里面的,然后我们再看里面的内容,str不就是我存储字符串"xiaojinzi"用到的key么,同理int也是我存储数值10的时候的key,所以我们就明白了大半,所谓的轻量级储存其实就是对一个指定的xml文件进行读写操作,每一个值都是用一个标签表示的,标签名字代表数据的类型,name属性的值表示的是这个数据对应的key,类似于Map集合中的key,一个key对应一个value

上述就是轻量级存储的原理,说白了就是对xml的操作进行了很好的封装,可能有的人不理解,为什么要把数据类型也保存起来?因为在xml中保存的全都是字符串,而你保存的数据可能是各种的基本类型,最后都存储为了字符串,那你获取数据的时候你自己可能知道你保存的是什么类型的数据,但是Android系统不知道啊,他必须有一个可以判断的值,这个值就是标签的名字,从标签的名字就可以知道这个数据是什么类型的,从而可以帮你做数据的转换,如果你获取的数据类型和保存的不一致,则报错!

给出一个报错的例子,还是使用上述的例子,代码稍作修改

// 获取字符串public void getString(View v) {//String str = sharedPreferences.getString("str", "null");        String str = sharedPreferences.getString("int", "null");Toast.makeText(this, str, Toast.LENGTH_SHORT).show();}

我把getString方法中的参数key换成了xml文件中整型数据的那个key,上面我已经说明如果你获取的类型和保存的不一致,就会报错,那么我们来验证


可以看到app报了一个类型转换的运行时异常,所以你获取的时候一定要记得和保存的类型是一致的,否则app会挂掉哦

本篇博客针对一些对SharedPreferences不太懂的童鞋,有什么不懂的地方欢迎留言!

也欢迎大家转载: http://blog.csdn.net/u011692041/article/details/51205405

1 0
原创粉丝点击