上一节介绍了如何获取SharedPreferences,已经如何修改Context保存位置。大家知道SharedPreferences是用来保存数据的,那么当然就少不了对数据的增删改查,这一节我们来具体学习下。
在学习之前我们先来看下源码,SharedPreferences是一个接口他的源码如下
//获取所有的存储的值
Map<String, ?> getAll();
//获取存储的String类型的值
String getString(String key, @Nullable String defValue);
//获取存储的String类型的set集合
Set<String> getStringSet(String key, @Nullable Set<String> defValues);
//获取存储的int类型的值
int getInt(String key, int defValue);
//获取存储的long类型的值
long getLong(String key, long defValue);
//获取存储的float类型的值
float getFloat(String key, float defValue);
//获取存储的boolean类型的值
boolean getBoolean(String key, boolean defValue);
//查看是否存储对应key的值
boolean contains(String key);
//获取编辑器
Editor edit();
//注册SharedPreferences值变化监听器
void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
//注销SharedPreferences值变化监听器
void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
通过查看源代码我们发现没有删除、修改、添加的方法,那么他的值是怎么添加、删除、修改呢?其中我们发现有一个方法获取一个Editor对象的方法,这个Editor是什么呢,有名字可以知道是一个编辑器,那么这个编辑器是干什么用的呢?为了了解Editor的作用,我们先查看下源代码,Editor是一个接口
//存放,修改String类型的值
Editor putString(String key, @Nullable String value);
//存放,修改String类型的set集合
Editor putStringSet(String key, @Nullable Set<String> values);
//存放,修改int类型的值
Editor putInt(String key, int value);
//存放,修改long类型的值
Editor putLong(String key, long value);
//存放,修改float类型的值
Editor putFloat(String key, float value);
//存放,修改boolean类型的值
Editor putBoolean(String key, boolean value);
//删除key键所对应的值
Editor remove(String key);
//清空
Editor clear();
//提交,同步提交到磁盘
boolean commit();
//提交,异步保存到磁盘
void apply();
通过查看源码可以知道Editor作用就是对SharedPreferences中的数据进行增、删、查。为什么需要一个提交的方法而不是每次添加数据后直接提交了,这是为了方便保存多条数据的时候避免多次提交,用空间换时间。
下面我们来看看Editor的实现,具体实现是在android.app.SharedPreferencesImpl$EditorImpl,这里我们只看一个string类型的保存,首先看看源代码
private final Object mLock = new Object();//同步锁
private final Map<String, Object> mModified = Maps.newHashMap();//数据暂存区
//存放数据,将数据放入暂存区
public Editor putString(String key, @Nullable String value) {
synchronized (mLock) {
mModified.put(key, value);
return this;
}
}
提交数据就是一个数据同步到SharedPreferences中,然后再写到文件中的过程,这里就不介绍了。
下面我们再来看看SharedPreferences的实现,具体实现是在android.app.SharedPreferencesImpl,这里我们也只看获取string类型值,首先看看源代码
public String getString(String key, @Nullable String defValue) {
synchronized (mLock) {
awaitLoadedLocked();//等待加载
String v = (String)mMap.get(key);//从map中获取数据
return v != null ? v : defValue;
}
}
从方法中我们发现数据的来源也是在map中,为什么要放一个中间的map而不是每次从xml文件中获取,其实这也是一个空间换取时间的方式,为了更快的响应,所以就把数据放入map中,每次只读取一次xml文件