【从零到一】Android数据存储(二) | SharedPreference


什么是SharedPreference?

SharedPreference是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置。


SharedPreference的特点

  1. 数据类型:支持基本数据类型,不支持自定义数据类型
  2. 存储键值对方式存储
  3. 保存:保存到data/data/<package_name>/shared_prefs/中自定义的XML文件中
  4. 访问:默认情况下只能在APP内部访问

键值对方式是一种非结构化的存储方法,非结构化是指字段的存储不需要表与字段相互的关联关系,为单纯的Key-Value关系,非常简便轻量。


SharedPreference的使用

  1. 获取SharedPreference对象
  2. 将数据存入SharedPreference
  3. 从SharedPreference中读取数据
  4. 封装SharedPreference工具类

1.获取SharedPreference对象

方法 参数 作用
PreferenceManager.getDefaultSharedPreferences(Context context) context :上下文 创建以包名为前缀的XML文件
Activity.getSharedPreferences(String name,int mode) 1.String name :文件名(无需后缀) 2.int mode :模式(如下4种) 创建以name为文件名的XML文件
MODE_PRIVATE(只能该应用读写)
MODE_WORLD_READABLE(可以被其他应用读取,但不可写入)
MODE_WORLD_WRITEABLE(可被其他应用读写)
MODE_APPEND(检查文件是否存在,存在直接追加内容,不存在则直接创建)

获取SharedPreference对象:

SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
//                SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件

2.将数据存入SharedPreference

在这里插入图片描述
在这里插入图片描述

方法 参数 作用
SharedPreferences.edit() 返回一个EditorImpl对象
Editor.putXX(String key, int value) 1.String key:键 2. int value:值 传入键值对形式数据
Editor.apply() 将数据保存到磁盘中,异步保存(不会阻塞当前线程)
Editor.commit() 将数据保存到磁盘中,同步保存

将数据存入SharedPreference:

    private void initViews() {
        mEtKey = findViewById(R.id.etKEY);
        mEtValue = findViewById(R.id.etVALUE);
        mBtnSave = findViewById(R.id.btnSave);

        mBtnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //保存用户输入的键值对
                String key = mEtKey.getText().toString().trim();
                String value = mEtValue.getText().toString().trim();
                SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
//                SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件
                SharedPreferences.Editor editor = sharedpreferences.edit();//获取editorlmpl对象
                editor.putString(key,value);//传入键值对形式的数据
//                editor.commit();//同步保存
                editor.apply();//异步保存(不会阻塞当前线程,推荐)
            }
        });
    }

在这里插入图片描述

3.从SharedPreference中读取数据

方法 参数 作用
SharedPreferences.getXX(String key, String defValue) 1.String key:键 2.String defValue:找不到key时返回的指定值 读取数据

在这里插入图片描述在这里插入图片描述

private void initViews() {
        mEtReadKey =findViewById(R.id.etReadKEY);
        mTvReadValue = findViewById(R.id.tvReadVALUE);
        mBtnRead = findViewById(R.id.btnRead);
        
        mBtnRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //读取用户输入key的value
                String key = mEtReadKey.getText().toString().trim();
                SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo",MODE_PRIVATE);
                String value = sharedpreferences.getString(key, "null");
                mTvReadValue.setText(value);
            }
        });
    }

4.封装SharedPreference工具类

回顾一下上面的内容:
向SharedPreference中存入数据的步骤:

  1. 获取SharedPreferences对象
  2. 获取EditorImpl对象
  3. 通过editor.putxx()写入键值对形式数据
  4. 提交数据
    从SharedPreference中读取数据的步骤:
  5. 获取SharedPreferences对象
  6. 通过getxx()获取key对应value的值

是不是觉得有点冗余繁琐,我们最终目的只是写入/读取SharedPreferences数据,那是不是能简化一下这个过程呢?是的,我们可以通过封装SharedPreferences工具类,简化我们的代码。

1.创建一个SharedPreferencesUtil类,将我们需要的put()/set()方法封装到这个工具类中:

public final class SharedPreferencesUtil {
    private static final String FILE_NAME = "macardo";
    private static SharedPreferencesUtil mInstance;

    private SharedPreferencesUtil() {
    }

    //单例模式
    public static SharedPreferencesUtil getInstance() {
        if (mInstance == null) {
            //synchronized 加锁,涉及多线程安全问题
            synchronized (SharedPreferencesUtil.class) {
                if (mInstance == null) {
                    mInstance = new SharedPreferencesUtil();
                }
            }
        }
        return mInstance;
    }
    
    //写入
    public void put(Context context, String key, Object value) {
        String type = value.getClass().getSimpleName();
        SharedPreferences sharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        if ("Integer".equals(type)) {
            editor.putInt(key, (Integer) value);
        } else if ("Boolean".equals(type)) {
            editor.putBoolean(key, (Boolean) value);
        } else if ("String".equals(type)) {
            editor.putString(key, (String) value);
        } else if ("Float".equals(type)) {
            editor.putFloat(key, (Float) value);
        } else if ("Long".equals(type)) {
            editor.putLong(key, (Long) value);
        }
        editor.apply();
    }
    
    //读取
    public Object get(Context context,String key,Object defValue){
        SharedPreferences sharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        String type = defValue.getClass().getSimpleName();
        if ("Integer".equals(type)) {
            return sharedPreferences.getInt(key,(Integer) defValue);
        } else if ("Boolean".equals(type)) {
            return sharedPreferences.getBoolean(key,(Boolean) defValue);
        } else if ("String".equals(type)) {
            return sharedPreferences.getString(key,(String) defValue);
        } else if ("Float".equals(type)) {
            return sharedPreferences.getFloat(key,(Float) defValue);
        } else if ("Long".equals(type)) {
            return sharedPreferences.getLong(key,(Long) defValue);
        }
        return null;
    }
}

2.在MainActivity中调用:

    private void initViews() {
        mEtKey = findViewById(R.id.etKEY);
        mEtValue = findViewById(R.id.etVALUE);
        mBtnSave = findViewById(R.id.btnSave);
        mEtReadKey =findViewById(R.id.etReadKEY);
        mTvReadValue = findViewById(R.id.tvReadVALUE);
        mBtnRead = findViewById(R.id.btnRead);

        mBtnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //保存用户输入的键值对
                String key = mEtKey.getText().toString().trim();
                String value = mEtValue.getText().toString().trim();

/*
                SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo", MODE_PRIVATE);//创建名为macardo的XML文件
//                SharedPreferences sharedpreferences =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);//创建以包名为前缀的XML文件
                SharedPreferences.Editor editor = sharedpreferences.edit();//获取editorlmpl对象
                editor.putString(key,value);//传入键值对形式的数据
//                editor.commit();//同步保存
                editor.apply();//异步保存(不会阻塞当前线程,推荐)
*/
                SharedPreferencesUtil.getInstance().put(MainActivity.this,key,value);
            }
        });

        mBtnRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //读取用户输入key的value
                String key = mEtReadKey.getText().toString().trim();

                /*
                SharedPreferences sharedpreferences = MainActivity.this.getSharedPreferences("macardo",MODE_PRIVATE);
                String value = sharedpreferences.getString(key, "null");
                */

                String value = (String) SharedPreferencesUtil.getInstance().get(MainActivity.this, key, "null");
                mTvReadValue.setText(value);
            }
        });
    }

3.OK,这样一来就简洁多了。好了关于SharedPreference就总结到这里,希望对你有所帮助。

Github项目地址: Macardo-MySharedPreference.

猜你喜欢

转载自blog.csdn.net/weixin_43482267/article/details/88858684
今日推荐