SharedPreferences是使用键值对的方式来存储数据的。Android中得到SharedPrefernces方法的方法有以下三种:
1.Context的getSharedPreferences(String name, int mode)
。
name为文件的名称,如果指定的文件不存在则会创建一个,文件都是存放在/data/data/<package name:="">/shared prefs目录下的。mode指定操作模式,目前只有MODE_PRIVATE这一种模式可选,也是默认的操作模式,与直接传入0效果是相同的,表示只有当前的应用程序才可以对这个指定文件进行读写。其他几种操作模式均已被废弃,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE已在Android 4.2中被废弃的,MODE_MULTI_PROCESS在Android 6.0中被废弃。</package>
2.Activity类的getPreferences(int mode)
。
这个方法会自动将当前活动类名作为文件名,只接收一个操作模式参数。
3.РrеfеrеnсеМаnаgеr类的PreferenceManager.getDefaultSharedPreferences(Context context)
这是一个静态方法,将应用程序的包名作为前缀来命名文件名,接收一个Context 参数。
基本使用:
1.保存数据
SharedPreferences.Editor editor = getSharedPreferences("name",MODE_PRIVATE).edit();
editor.putString("userName","Tom");
editor.putInt("age",21);
editor.putBoolean("married",false);
editor.apply();
2.读取数据
SharedPreferences sharedPreferences = getSharedPreferences("name",MODE_PRIVATE);
sharedPreferences.getString("userName","");
sharedPreferences.getInt("age",0);
sharedPreferences.getBoolean("married",false);
流程图:
sp 中几种文件创建模式:
- MODE_PRIVATE
默认的模式,当前创建的文件只能被当前 Application 使用。
2.MODE_WORLD_READABLE
读模式,允许其他应用程序读取该文件,在 Android N 之后会有一个 SecurityException 异常。@Deprecated
3.MODE_WORLD_WRITEABLE
写模式,允许其他应用程序写入该文件,在 Android N 之后会有一个 SecurityException 异常。@Deprecated
4.MODE_MULTI_PROCESS
多进程模式,这种模式是不安全的,官方不建议使用,可以使用 ContentProvider 来代替。当设置MODE_MULTI_PROCESS模式, 则每次getSharedPreferences过程, 会检查SP文件上次修改时间和文件大小, 一旦所有修改则会重新从磁盘加载文件。@Deprecated
SharedPreference提交的commit与apply的区别
这两个方法的区别在于:
- apply没有返回值而commit返回boolean表明修改是否提交成功
- apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
- apply方法不会提示任何失败的提示。
由于在一个进程中,sharedPreference是单实例,一般不会出现并发冲突,如果对提交的结果不关心的话,建议使用apply,当然需要确保提交成功且有后续操作的话,还是需要用commit的。
SharedPreferences 工具类:
/**
* spName :为文件名
* key 值 通过key得到value
*
*
* Commit: 在当前线程中 立即提交 写入到文件中
*
* Apply:也可以提交数据 不会占用主线程。会创建子线程在后台将内容写入到SD 卡中。
*/
public class MvpSpUtils {
//创建一个sp 的文件
private static final String DEFAULT_SP_NAME = "mvp_sp_config";
//定义一个16进制的变量
private static final int TYPE_COMMIT = 0X100;
private static final int TYPE_APPLY = 0X101;
//创建静态的 方法 返回值为String 的方法 包含一个参数 key 通过key得到value
public static String getString(String key){
return getString(DEFAULT_SP_NAME, key);
}
//创建静态的方法 返回值为String 的方法 包含二个参数 key spName 通过key得到value
public static String getString(String spName,String key){
return MvpManager.getContext().getSharedPreferences(spName, Context.MODE_PRIVATE).getString(key,null);
}
//创建静态的 方法 返回值为long 的方法 包含一个参数 key 通过key得到value
public static long getLong(String key){
return getLong(DEFAULT_SP_NAME, key);
}
//创建静态的方法 返回值为long 的方法 包含二个参数 key spName 通过key得到value
public static long getLong(String spName,String key){
return MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE).getLong(key,0);
}
//删除 key 清除文件
public static void remove(String key){
remove(DEFAULT_SP_NAME,key);
}
//删除 key 将spName 文件清除
public static void remove(String spName,String key){
SharedPreferences preferences = MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.remove(key);
editor.commit();
}
public static void saveCommit(String key, Object value){
saveString(DEFAULT_SP_NAME,key,value,TYPE_COMMIT);
}
public static void saveCommit(String spName, String key, Object value){
saveString(spName,key,value,TYPE_COMMIT);
}
public static void saveApply(String spName, String key, Object value){
saveString(spName,key,value,TYPE_APPLY);
}
public static void saveApply(String key, Object value){
saveString(DEFAULT_SP_NAME,key,value,TYPE_APPLY);
}
//保存文件 将key value 保存在以spName 的文件中 ,
private static void saveString(String spName,String key,Object value,int type){
SharedPreferences preferences = MvpManager.getContext().getSharedPreferences(spName,Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
//但是遇到不同的情况可以进行判断
if(value instanceof String){
editor.putString(key,value.toString());
}else if(value instanceof Float){
editor.putFloat(key, (Float) value);
}else if(value instanceof Integer){
editor.putInt(key, (Integer) value);
}else if(value instanceof Boolean){
editor.putBoolean(key, (Boolean) value);
}else if(value instanceof Long){
editor.putLong(key, (Long) value);
}
//如果是type_apply 就以apply 提交数据 否则相反
if(type == TYPE_APPLY){
editor.apply();
}else{
editor.commit();
}
}
}
网友评论