美文网首页
SharedPreferences 使用

SharedPreferences 使用

作者: 夜沐下的星雨 | 来源:发表于2020-08-06 00:33 被阅读0次

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 中几种文件创建模式:

  1. 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的区别

这两个方法的区别在于:

  1. apply没有返回值而commit返回boolean表明修改是否提交成功
  2. apply是将修改数据原子提交到内存, 而后异步真正提交到硬件磁盘, 而commit是同步的提交到硬件磁盘,因此,在多个并发的提交commit的时候,他们会等待正在处理的commit保存到磁盘后在操作,从而降低了效率。而apply只是原子的提交到内容,后面有调用apply的函数的将会直接覆盖前面的内存数据,这样从一定程度上提高了很多效率。
  3. 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();
        }
    }
}

相关文章

网友评论

      本文标题:SharedPreferences 使用

      本文链接:https://www.haomeiwen.com/subject/qmsarktx.html