SharedPreferences轻量存储的详细使用,以及工具类的编写

SharedPreferences简介

Sharedpreferences是Android平台一个轻量级的存储类,用来保存应用程序的一些简单信息,是一个以“键值”对的方式保存数据的xml文件,产生的文件保存在/data/data/应用包名/shared_prefs目录下,是日常开发非常常用的一个数据存储类。

常用于:比如我们要保存一个用户是否第一次进入软件、用户的账号、是否勾选了保存密码等等这一类比较简单的信息

注意事项:可以看到图中,所有数据在手机root情况下,进入文件夹,都是一展无遗的,所以如果有重要的数据最好是进行加密后再存储

其文件内容如图:

在这里插入图片描述

SharedPreferences保存数据

实例化

SharedPreferences的实例化也有几种不同的方法,比如

  1. Context类中的getSharedPreferences()方法

  2. Activity类中的getPreferences()方法

  3. PreferenceManager 类中的 getDefaultSharedPreferences()方法

    这里我们主要讲最常用的Context类中的getSharedPreferences()方法

SharedPreferences sharedPreferences = getSharedPreferences("filename", MODE_PRIVATE);

这里我们需要传入两个参数:

name:

也就是你保存到/data/data/应用包名/shared_prefs目录下的文件的名字

mode:操作模式

  • MODE_PRIVATE: 保存的数据只能被本应用读、写;
  • MODE_WORLD_READABLE: 保存的数据能被其他应用程序读,但不能写;
  • MODE_WORLD_WRITEABLE: 保存的数据能被其他应用程序读写;
  • MODE_APPEND:检查文件是否存在,存在就往文件加内容,不存在就创建新文件;
Editor

光有SharedPreferences对象是不能进行数据保存的,需要一个SharedPreferences.Editor对象才能对数据进行插入保存,所以我们还需要实例化一个Editor

SharedPreferences.Editor editor = sharedPreferences.edit();
存储数据

有了Editor,我们就能进行存储数据了,可以存储的数据类型也是多达6种:String、int、boolean、float、long还有Set< String > ,所有的数据都是以键值对(key-value)的形式存入到文件中,只需要调用Editor的 .putXxxx() 方法,传入 key 和你需要存储的数据即可

	    editor.putString("string", "abc");
        editor.putInt("int", 123);
        editor.putFloat("float", 0.001f);
        editor.putBoolean("boolean", true);
        editor.putLong("long", 123123);
        editor.putStringSet("str_set", Set<String>);
提交保存

put了数据还只是相当于在半路中,想要真正把数据保存下来,还需要进行一个提交,这里的提交又有两种方法:

  • .apply() 无返回值,简单理解成 异步提交
  • .commit() 有返回值(返回true代表存储成功,否则存储失败),简单理解成 同步提交

所以一般情况下我们是优先选择 .apply() 方法进行提交保存数据的。

editor.apply();

SharedPreferences获取数据

保存了数据,那么怎么获取?获取的话相比保存数据而言要稍微简单那么一丢丢,获取是不需要Editor对象的,直接使用SharedPreferences对象调用 .getXxxx() 方法,传入你之前保存数据时传入的 key ,然后再传入一个未获取到数据时应用的 默认值 即可获取数据

sharedPreferences.getString("string","");
sharedPreferences.getInt("string",0);
sharedPreferences.getFloat("string",0);
sharedPreferences.getBoolean("string",false);
sharedPreferences.getLong("string",0);
sharedPreferences.getStringSet("string", Set<String>());
defValue默认值

获取数据时,需要传入 key ,和一个 defValue ,这个默认值,就是当你的key没有找到相应的 key 时,那么就会返回这个 defValue

工具类的编写

由于SharedPreferences是开发中比较常用的一种数据存储方式,所以一个工具类也是非常有必要的存在,在这里也会拓展几个SharedPreferences里上面没有讲到的方法,接下来一步步带你理解,毕竟理解万岁嘛!

创建一个 工具类

创建一个SpUtils.java,并写好几个无论是存储数据,还是获取数据都需要用到的对象和常量,这些都不用多说

public class PreferencesUtils {
    
    //SharePreferences保存在本地的文件名
    private static final String SHARE_DATA = "share_data";
    private static SharedPreferences sp;
    private static SharedPreferences.Editor editor;
    
}
存储数据的方法

这里呢,put() 方法,传入Context、key、和一个Object,也就是 上下文、存储数据时的key,和一个Object对象,为什么用Object呢?

优点:如果这里不用Object,而是一个 String 或者是 int 、float 之类的数据类型,那么你想想,你要写多少个静态方法?String 的写一个,int 的写一个,float 的还要写一个… 那么用Object呢,就可以很好地避免这种情况的发生,无论你传入的是什么类型,我们都照单全收。

那么问题又来了:我们刚刚也讲到了,每个数据类型需要调用的 .putXxxx() 方法是不一样的,别着急,接着看

所以我们就需要用一个 if 语句来对传入的数据类型进行一个判断,这里用到了 instanceof 关键字,也就是说当你传入的数据是String 类型时,我们调用 .putString() ,传入 int 数据类型时,我们调用 .putInt() 方法,以此类推,这样就很好地解决了这个问题。

最后 editor.apply(); ,存储数据的方法就算是写完了,可以开始愉快地存储数据了!

public static void put(Context context, String key, Object value) {

        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);

        editor = sp.edit();

        if (value instanceof String) {
            editor.putString(key, (String) value);
        } else if (value instanceof Boolean) {
            editor.putBoolean(key, (Boolean) value);
        } else if (value instanceof Integer) {
            editor.putInt(key, (Integer) value);
        } else if (value instanceof Float) {
            editor.putFloat(key, (Float) value);
        } else if (value instanceof Long) {
            editor.putLong(key, (Long) value);
        } else {
            editor.putString(key, value.toString());
        }

        editor.apply();
    }

获取数据的方法

这里的参数逻辑和上面 存储数据方法 的逻辑是一样的,只不过这里是通过判断 传入的默认值,来进行判断,然后调用对应的 .getXxxx() 方法,再return返回数据

public static Object get(Context context, String key, Object defaultValue) {

        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);

        if (defaultValue instanceof String) {
            return sp.getString(key, (String) defaultValue);
        } else if (defaultValue instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultValue);
        } else if (defaultValue instanceof Integer) {
            return sp.getInt(key, (Integer) defaultValue);
        } else if (defaultValue instanceof Float) {
            return sp.getFloat(key, (Float) defaultValue);
        } else if (defaultValue instanceof Long) {
            return sp.getLong(key, (Long) defaultValue);
        }

        return null;
    }
补充两个方法
  • 清除所有数据

这里,调用此方法后,你当前 文件名 下的所有数据将会被清除

public static void clean(Context context) {
        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);
        editor = sp.edit();
        editor.clear();
        editor.apply();
    }
  • 获取所有的键值对

返回当前 文件名 下所有的键值对,也就是你存储的所有数据,这里的返回类型是一个Map< String , ?>

public static Map<String, ?> getAll(Context context) {
        sp = context.getSharedPreferences(SHARE_DATA, Context.MODE_PRIVATE);
        return sp.getAll();
    }

看完文章,觉得还不错的话,点个赞吧!
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章