SharedPreference基本知识点总结
1. SharedPreference
SharedPreference是Android设置的一个轻量级的数据存储的方式。它可以将数据以键值对的形式存放到文件中,在你需要的时候再取出来。
- 用键值对的形式存储数据,文件内容是这样的(后面代码生成的文件)。
- 默认的存储路径是:data/data/应用程序的包名/shared_prefs,存储文件的格式是xml格式。
- 存储路径可以手动修改。
- 一般用于存储重要内容和做一些判断,比如说判断用户是否是第一次打开app。
2. 基本用法
2.1 获取sharedpreference实例
有三种获取实例的方法
- Context类获取SharedPreference实例。
// Activity类继承Context类,可以直接调用 // 打开指定的文件,如果文件不存在则会创建一个 SharedPreference sharedPreferences = getSharedPreferences("test", MODE_PRIVATE); // 第一个参数代表文件名,第二个代表读写权限,现在的版本只有MODE_PRIVATE值,表示只有本应用有读写权限
- Activity类中自带的方法。
SharedPreference sharedPreferences = getSharedPreference(MODE_PRIVATE); // Context类方法的简化版,文件名是当前的类名。
- PreferenceManager中的静态方法(此方法已过时)。
SharedPreference sharedPreferences = PreferenceManager.getDefaultSharedPreference(this); // 传入的参数是context
2.2 保存和读取
-
保存需要用到SharedPreference.Editor,但是用法很简单,保存用键值对的形式保存。
SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("name", "SharedPreferenceDemo"); // 第一个参数是key,第二个参数是value editor.apply(); // 异步提交,是void方法应用之后就会存储 //editor.commit(); // 阻塞式提交,是boolean方法,会返回是否提交成功
注意提交的方式有apply和commit两种,apply是异步提交,用工作线程;commit是阻塞提交,用当前线程。
可以保存的数据类型如下图,不能保存序列化类型。
-
读取不需要用到Editor,可以直接读取。
String name = sharedPreferences.getString("name", "default"); // 第一个参数是读取的key值,第二个参数是读取失败时的默认值。
3. 特点和总结
其实sharedPreference的性能效率并不高,总结之后有如下几点:
- 读取的速度较慢,当我们获取sharedpreference的实例时,实际上已经做完了对整个文件的读取,可想而知,如果文件容量过大,那么相应的读取时间也会变得更长,如果使用不注意再加上用主线程加载的话,很容易就会导致应用卡住。
- 存储的速度较慢,无论是使用改动一个条目还是多个条目,文件都会被整个覆盖,这样当然就慢了。
- 占内存,之前也说了,获取实例的时候,会对整个文件进行读取,那么这些读取后的文件自然会占内存,如果不注意的话容易引发各种各样的缺内存事故。
所以对于SharedPreference,其实用起来很简单:
- 不要存放过长的key和value,那些奇奇怪怪的json串就别存了。
- 不用分成多个文件存储,因为实际上他们在读取之后都是只有程序结束后才会销毁回收内存。
- 如果要修改内容,尽量全部修改完再一起提交。
我们的项目一般不用sharedPreference,而是用开源库MMKV来代替它,所以本文也就仅记录一个demo。
参考材料
Android中的SharedPreferences存储 - 萧安 - 博客园
https://www.cnblogs.com/HenuAJY/p/10933370.html
Android之SharedPreferences简介及使用说明_移动开发_casual_clover的博客-CSDN博客
https://blog.csdn.net/casual_clover/article/details/102466381
SharedPreference为什么不适合存储大量数据_移动开发_YanRu的专栏-CSDN博客
https://blog.csdn.net/u010335298/article/details/72884644