一、简介
SharedPreferences
是Android平台上一个轻量级的存储类,主要是保存一些常用的配置比如窗口状态,一般在Activity、重载窗口状态onSaveInstanceState
使用SharedPreferences完成,它提供了Android平台常规的Long长整形、Int整形、String字符串型等的保存。
它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,其存储位置在/data/data/<包名>/shared_prefs目录下。
SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。
二、使用
SharedPreferences的一般使用流程
- 1.使用ContextWrapper子类调用
getSharedPreferences
方法获得SharedPreferences对象;- 2.使用SharedPreferences接口的edit
获得SharedPreferences.Editor
对象;- 3.通过SharedPreferences.Editor接口的
putXXX
方法保存key-value对;- 4.通过过SharedPreferences.Editor接口的
commit
方法保存key-value对。
//获取SharedPreferences对象
SharedPreferences sharedPreferences = getSharedPreferences("user",MODE_PRIVATE);
//获取Editor对象的引用
SharedPreferences.Editor editor = sharedPreferences.edit();
//插入键值对
editor.putString("name", "henry");
editor.putInt("age", 25);
editor.putBoolean("islogin",true);
// 提交数据
editor.commit();
2.1 getSharedPreferences
getSharedPreferences(“user”, MODE_PRIVATE)方法用于获取一个特定名称的SharedPreferences对象。这个方法有两个参数,分别是SharedPreferences的名称和模式。
MODE_PRIVATE
:表示私有模式,即只有当前应用程序可以访问这个SharedPreferences文件。其他应用程序无法访问。
其他常用模式包括:
MODE_WORLD_READABLE
:表示该SharedPreferences文件可以被其他应用程序读取,但不允许写入。
MODE_WORLD_WRITEABLE
:表示该SharedPreferences文件可以被其他应用程序读取和写入,不推荐使用,因为安全性较低。
MODE_MULTI_PROCESS
:表示在多个进程中可以同时访问该SharedPreferences对象,已经废弃,不建议使用。
MODE_APPEND
:表示在写入数据时,将新数据追加到现有数据之后。
区别:
MODE_PRIVATE
:是最常用的模式,只有当前应用可以访问SharedPreferences文件,保证了数据的私密性和安全性。
MODE_WORLD_READABLE
和MODE_WORLD_WRITEABLE
:允许其他应用程序访问SharedPreferences文件,但安全性较低,可能会造成数据泄露。
MODE_MULTI_PROCESS
:已经废弃,不建议使用。
MODE_APPEND
:用于在写入数据时追加到现有数据之后,适用于需要保留历史数据的场景。
2.2 增加数据
editor.putxxx系列方法
//插入键值对
editor.putString("name", "henry");
editor.putInt("age", 25);
editor.putBoolean("islogin",true);
2.3 读取数据
读取数据通过SharedPreferences对象,第二个参数一般是个默认值,表示当获取数据的时候没有该key则返回一个默认值。
String name=sharedPreferences.getString("name","");
int age = sharedPreferences.getInt("age",0);
boolean islogin = sharedPreferences.getBoolean("islogin",true);
2.4 删除数据
通过Editor对象的remove()方法
editor.remove("name");
editor.remove("age");
2.5 修改数据
修改数据跟增加数据类似,覆盖原来的数据即修改数据。
editor.putString("name", "henry");
editor.putInt("age", 25);
editor.putBoolean("islogin",true);
2.6 清除数据
Editor对象的clear方法来完成清楚数据
editor.clear();
2.7 提交数据
每一次的修改完需要保存,都需要提交。
editor.commit();
值得注意的是
:
SharedPreferences.Editor 提供了两种方法来提交对 SharedPreferences 的修改,分别是 commit() 和 apply() 方法。这两种方法的主要区别如下:
- commit和apply虽然都是原子性操作,但是原子的操作不同,commit是原子提交到数据库,所以从提交数据到存在Disk中都是同步过程,中间不可打断。
- 而apply方法的原子操作是原子提交的内存中,而非数据库,所以在提交到内存中时不可打断,之后再异步提交数据到数据库中,因此也不会有相应的返回值。
- 所有commit提交是同步过程,效率会比apply异步提交的速度慢,但是apply没有返回值,永远无法知道存储是否失败。
- 在不关心提交结果是否成功的情况下,优先考虑apply方法。