欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

简介Android应用中sharedPreferences类存储数据的用法

程序员文章站 2024-02-23 18:13:46
在android开发中,经常会遇到这样一种情况,即需要将用户偏好设置(如用户偏好的app色彩主题)、与特定登录用户相关的设置(如不同登陆用户的偏好)、整个app的生命周期内...

在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);