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
- android 详解 SharedPreferences
- Android之SharedPreferences详解
- Android之SharedPreferences详解
- Android SharedPreferences详解
- android SharedPreferences详解
- Android之SharedPreferences详解
- [Android]SharedPreferences详解
- Android 中SharedPreferences详解
- Android sharedpreferences使用详解
- Android SharedPreferences 详解
- Android之SharedPreferences详解
- Android之SharedPreferences详解
- Android之SharedPreferences详解
- android SharedPreferences详解
- Android SharedPreferences详解
- 【android学习】SharedPreferences详解
- Android SharedPreferences详解
- Android之SharedPreferences详解
- c#中获取cpu序列号、网卡mac地址、ip地址、硬盘序列号、登录用户名、pc类型、计算机名称、物理内存
- android音视频点/直播模块开发
- 第6周项目4-静态成员应用
- 详解css3弹性盒模型(Flexbox)
- 响应式布局图片处理
- Android SharedPreferences详解
- LeetCode 172. Factorial Trailing Zeroes
- 第五周项目一—三角形类定义成员函数
- Android自定义控件:仿美团下拉菜单及相关代码优化
- 第八周-武器类-多文件
- bzoj3745: [Coci2015]Norma
- c++作业4
- 第八周【项目1 - 数组作数据成员1】
- 第七周项目1—两点间的距离—成员函数、友元函数和一般函数