SharedPreferences
性能
ShredPreferences是单例对象,第一次打开后,之后获取都无需创建,速度很快。
当第一次获取数据后,数据会被加载到一个缓存的Map中,之后的读取都会非常快。
当由于是XML<->Map的存储方式,所以,数据越大,操作越慢,
get、commit、apply、remove、clear都会受影响,所以尽量把数据按功能拆分成若干份。
Android 五种数据存储的配置信息方式之一。
ContentProvider:将应用的私有数据提供给其他应用使用;
文件存储:以IO流形式存放,可分为手机内部和手机外部(sd卡等)存储,可存放较大数据;
SQLite:轻量级、跨平台数据库,将所有数据都是存放在手机上的单一文件内,占用内存小;
网络存储 :数据存储在服务器上,通过连接网络获取数据。
Sharedpreferences(不建议使用)是Android平台上一个轻量级的存储类,用来保存应用程序的各种配置信息,其本质是一个以“键-值”对的方式保存数据的xml文件,其文件保存在/data/data//shared_prefs目录下。
SharedPreferences可以保存的数据类型有:int、boolean、float、long、String、StringSet。
在全局变量上看,其优点是不会产生Application 、 静态变量的OOM(out of memory)和空指针问题,其缺点是效率没有上面的两种方法高。
SharedPreferences只能存储少量数据,大量数据不能使用该方式存储
还有腾讯的MMKV,Jetpack的DateStore,都用于配置信息
保存数据一般分为四个步骤:
使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
使用SharedPreferences接口的edit获得SharedPreferences.Editor对象;
通过SharedPreferences.Editor接口的putXXX方法保存key-value对;
通过过SharedPreferences.Editor接口的commit方法保存key-value对。
读取数据
读取数据一般分为两个步骤:
使用Activity类的getSharedPreferences方法获得SharedPreferences对象;
通过SharedPreferences对象的getXXX方法获取数据;
提交分为两个方法
commit和apply
SharedPreferences用来进程间共享数据,它只能存储简单数据类型(int、boolean、String 等)
复杂数据类型建议使用文件、数据库等其他方式存储。
SharedPreference 提 交 数 据 时 , 尽 量 使 用 Editor#apply(),而非Editor#commit()。
使用场景:
一般来讲,仅当需要确定提交结果,并据此有后续操作时,才使用 Editor#commit()。
SharedPreference 相关修改使用 apply 方法进行提交会先写入内存,然后异步写入磁盘,
apply没有返回值,而commit返回boolean表明修改是否提交成功
apply是将修改数据原子提交到内存,而后异步真正提交到硬件磁盘;
而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。
而apply只是原子的提交到内存,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率,apply方法不会提示任何失败的提示
commit方法是直接写入磁盘。如果频繁操作的话 apply 的性能会优于 commit,apply会将最后修改内容写入磁盘。
但是如果希望立刻获取存储操作的结果,并据此做相应的其他操作,应当使用 commit。
apply存数据
SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("name", "lala");
editor.putInt("age", 18);
editor.putBoolean("man", true);
editor.apply();
apply取数据
SharedPreferences sp = getSharedPreferences("data", MODE_PRIVATE);
String name = sp.getString("name", "aaa");
int age = sp.getInt("age", 0);
boolean man = sp.getBoolean("man", false);
获取Editor对象(由SharedPreferences对象调用)
abstract SharedPreferences.Editor edit()
写入数据(由Editor对象调用)
//写入boolean类型的数据
abstract SharedPreferences.Editor putBoolean(String key, boolean value)
//写入float类型的数据
abstract SharedPreferences.Editor putFloat(String key, float value)
//写入int类型的数据
abstract SharedPreferences.Editor putInt(String key, int value)
//写入long类型的数据
abstract SharedPreferences.Editor putLong(String key, long value)
//写入String类型的数据
abstract SharedPreferences.Editor putString(String key, String value)
//写入Set<String>类型的数据
abstract SharedPreferences.Editor putStringSet(String key, Set<String> values)
清空数据(由Editor对象调用)
abstract SharedPreferences.Editor clear()
提交数据(由Editor对象调用)
abstract boolean commit()
读取数据(由SharedPreferences对象调用)
//读取所有数据
abstract Map<String, ?> getAll()
//读取的数据为boolean类型
abstract boolean getBoolean(String key, boolean defValue)
//读取的数据为float类型
abstract float getFloat(String key, float defValue)
//读取的数据为int类型
abstract int getInt(String key, int defValue)
//读取的数据为long类型
abstract long getLong(String key, long defValue)
//读取的数据为String类型
abstract String getString(String key, String defValue)
//读取的数据为Set<String>类型
abstract Set<String> getStringSet(String key, Set<String> defValues)
SharedPreferences简单的用法
/**
* 保存用户信息
*/
private void saveUserInfo(){
SharedPreferences userInfo = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
SharedPreferences.Editor editor = userInfo.edit();//获取Editor
//得到Editor后,写入需要保存的数据
editor.putString("username", "一只猫的涵养");
editor.putInt("age", 20);
editor.commit();//提交修改
Log