简介Android应用中sharedPreferences类存储数据的用法
作者:iam_wingjay 发布时间:2023-04-30 22:34:48
在Android开发中,经常会遇到这样一种情况,即需要将用户偏好设置(如用户偏好的app色彩主题)、与特定登录用户相关的设置(如不同登陆用户的偏好)、整个app的生命周期内的设置(如首次登陆显示介绍页)存储在用户本地,那么首先考虑使用sharedPreferences。这是Android中专门用来存储轻量级键值对数据的类,会在本地以xml文件形式存储。
一、 运行机制
接口:SharedPreferencesImpl在该接口中,定义了一个Editor接口、一个edit方法、多个get方法、一个 * 用于监听内容变更。其中,Editor接口主要用来写入数据,edit方法用来对外提供一个editor实例,get方法用来获取键值对, * 用于实现类中监听。
接口:Editor接口中含有多个put方法、一个commit方法等。之所以要独立出一个接口来进行写操作,是为了保证数据写入的完整性。主要考虑的场景是如果同时要写入多条键值对,这些键值对不会逐条写入文件中,而是先打包在一起,再一次性写入,即one-at-a-time。具体实现方法是在Editor实现一个hashMap来暂存要写入的数据,先把所有键值对写入内存中的该hashMap中,然后再一次性写入文件中。
该过程可以概括为先commitToMemory, 再writeToFile。
二、 使用方法
首先,想写入键值对,要先获取一个sharedPreferences对象。
此时需要提供两个要素:context上下文对象,对应的文件名字。
这里,我们要明确这些键值对的实际存储方式:它们是以多个文件的形式存储: /data/data/{packageName}/shared_prefs/{name}.xml。其中,实际的{name}.xml是在程序中指定的。
那么,我们只要调用context.getSharedPreferences(name, mode)即可获取到所在packageName文件夹里对应的name.xml文件映射过来的SharedPreferences对象。其中,mode是读取文件的方式。
示例:
1、使用SharedPreferences保存数据方法如下:
//实例化SharedPreferences对象(第一步)
SharedPreferences mySharedPreferences= getSharedPreferences("test",
Activity.MODE_PRIVATE);
//实例化SharedPreferences.Editor对象(第二步)
SharedPreferences.Editor editor = mySharedPreferences.edit();
//用putString的方法保存数据
editor.putString("name", "Karl");
editor.putString("habit", "sleep");
//提交当前数据
editor.commit();
//使用toast信息提示框提示成功写入数据
Toast.makeText(this, "数据成功写入SharedPreferences!" , Toast.LENGTH_LONG).show();
执行以上代码,SharedPreferences将会把这些数据保存在test.xml文件中,可以在File Explorer的data/data/相应的包名/test.xml 下导出该文件,并查看。
2、使用SharedPreferences读取数据方法如下:
//同样,在读取SharedPreferences数据前要实例化出一个SharedPreferences对象
SharedPreferencessharedPreferences= getSharedPreferences("test",
Activity.MODE_PRIVATE);
// 使用getString方法获得value,注意第2个参数是value的默认值
String name =sharedPreferences.getString("name", "");
String habit =sharedPreferences.getString("habit", "");
//使用toast信息提示框显示信息
Toast.makeText(this, "读取数据如下:"+"\n"+"name:" + name + "\n" + "habit:" + habit,
Toast.LENGTH_LONG).show();
三、理解
我们可以简单的理解为:在手机本地某个地方会存放我们自定义的xml文件,每个文件用来存放相关的键值对数据。比如我们希望存储用户的偏好设置,即可创建一个名为UserPref的SharedPreferences并读写即可。
四、比较getSharedPreferenced和getPreference
getSharedPreferenced获取的文件是在package内都可以使用context对象获取到的,只需要指定name就可以获取到特定的xml文件。
但是,getPreference方法是专门用在Activity内部的,创建的xml文件只能在该Activity上下文内获取,而且不需要指定名字,这个xml文件只属于这个Activity。
其它就没有区别了。唯一区别就是一个权限域的区别。
示例:
Context context = getActivity();
SharedPreferences sharedPref = context.getSharedPreferences("userPref", MODE_PRIVATE);
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);


猜你喜欢
- 一、wapper介绍Wrapper : 条件构造抽象类,最顶端父类AbstractWrapper : 用于查询条件封装,生成 sql 的 w
- 背景:在android开发中,列表是经常会使用到的一个主要控件,列表中可以展示大量的数据,像订单、商品、通讯录、浏览记录或者关注列表等等。可
- 本文实例讲述了C#基于QRCode实现动态生成自定义二维码图片功能。分享给大家供大家参考,具体如下:二维码早就传遍大江南北了,总以为它是个神
- 前面我们完成了与商品类别相关的业务逻辑,接下来我们开始做具体商品部分。1. 数据库建表并映射Model首先我们在数据库中新建一张表,然后使用
- Android 加载大图及多图避免程序出现OOM(OutOfMemory)异常1、高效加载大图片我们在编写Android程序的时候经常要用到
- 相关阅读C#使用LINQ查询操作符实例代码(一)C#使用LINQ查询操作符实例代码(二)示例业务背景介绍示例参考《C#高级编程(第六版)》L
- 前言:本文主要讲解以c语言编写猜数字游戏,目的是介绍C语言中的循环和分支的具体用法。一:猜数字游戏基本介绍&对程序预期.猜数字游戏,
- 做了一个项目,首页是使用ResideMenu实现,通过菜单栏里的菜单项创建的Fragment;所以一个Activtiy里就包含多个Fragm
- 本文实例讲述了Java创建和启动线程的两种方式。分享给大家供大家参考,具体如下:方式1:继承Thread类步骤:1):定义一个类A继承于ja
- 在.net4.0以后异步操作,并行计算变得异常简单,但是由于公司项目开发基于.net3.5所以无法用到4.0的并行计算以及Task等异步编程
- 本文实例为大家分享了C# Email发送邮件的具体代码,供大家参考,具体内容如下//回执地址 var Receipt = &q
- Logback TurboFilter实现日志级别等内容的动态修改可能看到这个标题,读者会问:要修改日志的级别,不是直接修改log.xxx就
- 1、HashMap HashMap继承抽象类AbstractMap,实现接口Map、Cloneable, Serializable接口。Ha
- 本文实例为大家分享了Java实现学生管理系统的具体代码,供大家参考,具体内容如下1.学生管理系统(控制台界面实现)//学生类,继承Seria
- 一、概述从3.1版本起,Spring框架就已经支持将缓存添加到现有的Spring应用中,和事务支持一样,缓存抽象允许在对代码影响最小的情况下
- Android 中的危险权限详细整理前言:Android 中有上百种权限,现在将所有的权限归为两类:一类是普通权限一类的危险权限普通权限是指
- 新增获取自增列id1、实体类定义注意:@TableId(value = “id”, type = I
- 在绝大多数android机器etc路径下存放一个的apns-conf.xml文件,表示当前机器使用的apn信息通过root机器可以push出
- 本文介绍的仿IOS对话框的实现,先来看一下效果图具体代码如下:public class AlertDialog { private Cont
- AndroidStudio 的SVN 安装和使用方法与我以前用的其他IDE 都有很大差别,感觉特麻烦,网上相关资料很少,貌似现在 Git 比