一、前言

<font face = 黑体>数据的存储是我们在使用应用的过程中不可避免的操作,因为对于所有的应用而言我们主要的操作就是数据的读取与存储。

二、Android 中常用的数据存储方式

<font face = 黑体>Android 中常用的数据存储方式有以下几种:

  1. <font face = 黑体>SharePreferences 存储数据;
  2. <font face = 黑体>文件存储(内部、外部);
  3. <font face = 黑体>数据库存储(比如SQLite、greenDao、Room 等);
  4. <font face = 黑体>ContentProvider 存储数据;
  5. <font face = 黑体>网络存储数据(将数据存储在服务器端)。

<font face = 黑体>上面列出的五种存储方式里面,前面四种都属于本地数据存储方式,我们今天只讲 SharePreferences 的使用

三、SharePreferences 概述

<font face = 黑体>SharedPreferences 是一个轻量级的存储类,主要作用如下:

  • <font face = 黑体>用于存放一些类似登录的配置信息(小的数据,状态信息);
  • <font face = 黑体>本质上是一个 xml 文件,是通过类似键值对的方式存储信息;
  • <font face = 黑体>位于程序私有目录中,即data/data/[packageName]/shared_prefs 中。

四、SharePreferences 使用

4.1、案例演示

<font face = 黑体>我们要实现的案例如下所示:

Sp 案例

<font face = 黑体>这个案例具体流程就是在登录界面输入账号和密码,点击登录,如果账号和密码符合验证要求的话,我们就将账号和密码保存到 Sp 中,当下一次再进来的时候,就会在输入框中显示我们存储的信息,即账号和密码。我们平时使用的 App,大部分登陆界面都是这样做的。

4.2、利用 Sp 存储信息

<font face = 黑体>一般利用 Sp 存储信息有四个步骤,分别是

  1. <font face = 黑体>获取 Sp 对象;
  2. <font face = 黑体>获取 Editor 对象;
  3. <font face = 黑体>存储信息;
  4. <font face = 黑体>提交。

<font face = 黑体>具体代码如下所示:

findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    
        String account = accEdt.getText().toString();
        String password = pwdEdt.getText().toString();

        // 验证内容,这里写死
        if (account.equals("123") && password.equals("123")) {
            // 1:获取 Sp 对象
            SharedPreferences sp = getSharedPreferences("spConfig", Context.MODE_PRIVATE);
            // 2:获取 Editor 对象
            SharedPreferences.Editor editor = sp.edit();
            // 3:存储信息
            editor.putString("account", account);
            editor.putString("password", password);
            // 4:提交
            editor.commit();

            ToastUtil.showToast("登录成功");
        } else {
            ToastUtil.showToast("账号或密码错误");
        }
    }
});

4.3、Sp 中信息的读取

<font face = 黑体>Sp 的读取很简单,直接利用 Sp 对象就可以了,具体代码如下所示:

// Sp的读取
SharedPreferences sp = getSharedPreferences("spConfig", Context.MODE_PRIVATE);
String account = sp.getString("account", "");
String password = sp.getString("password", "");

4.4、完整代码

<font face = 黑体>完整代码如下所示:

public class ShareActivity extends AppCompatActivity {

    private EditText accEdt, pwdEdt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);

        ToastUtil.init(this);

        accEdt = findViewById(R.id.acc_edt);
        pwdEdt = findViewById(R.id.pwd_edt);

        // Sp的读取
        SharedPreferences sp = getSharedPreferences("spConfig", Context.MODE_PRIVATE);
        String account = sp.getString("account", "");
        String password = sp.getString("password", "");

        accEdt.setText(account);
        pwdEdt.setText(password);

        // 1:获取两个输入框的内容
        // 2:验证内容(123,123)
            // 2.1:验证通过,存储信息到 Sp 中
            // 2.2:验证失败,给用户相应的提示
        findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String account = accEdt.getText().toString();
                String password = pwdEdt.getText().toString();
                if (account.equals("123") && password.equals("123")) {
                    // 1:获取 Sp 对象
                    SharedPreferences sp = getSharedPreferences("spConfig", Context.MODE_PRIVATE);
                    // 2:获取 Editor 对象
                    SharedPreferences.Editor editor = sp.edit();
                    // 3:存储信息
                    editor.putString("account", account);
                    editor.putString("password", password);
                    // 4:提交
                    editor.commit();

                    ToastUtil.showToast("登录成功");
                } else {
                    ToastUtil.showToast("账号或密码错误");
                }
            }
        });
    }
}

4.5、查看 Sp 中存储的数据内容

<font face = 黑体>Sp 本质上是一个xml,想要看里面的内容,我们需要:

  1. <font face = 黑体>在 Android Studio 中打开 Device File Explorer(一般右下角就有,如果没有,就在顶部菜单按钮中依次点击 View -> Tools Windows -> Device File Explorer);
  2. <font face = 黑体>在 data/data/[包名]/shared_prefs 中查看。 内容
  3. 双击 spConfig.xml 查看

    <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
    <map>
        <string name="password">123</string>
        <string name="account">123</string>
    </map>

五、SharePreferences 工具类

<font face = 黑体>在真实项目中,利用 Sp 存储数据和读取数据是肯定不会像我们上面写的那样把每一步都写在逻辑代码中,一般会将其抽象成一个工具类供我们使用。我这里利用单例模式实现了一个 Sp 的工具类,具体代码如下所示:

public class SpUtil {

    private SharedPreferences sp;
    private SharedPreferences.Editor editor;

    private volatile static SpUtil mInstance = null;

    private SpUtil() {

    }

    // 单例模式
    public static SpUtil getInstance() {
        if (mInstance == null) {
            synchronized (SpUtil.class) {
                if (mInstance == null) {
                    mInstance = new SpUtil();
                }
            }
        }
        return mInstance;
    }

    public void initSp(Context mContext) {
        sp = mContext.getSharedPreferences("spConfig", Context.MODE_PRIVATE);
        editor = sp.edit();
    }

    public void putInt(String key, int values) {
        editor.putInt(key, values);
        editor.commit();
    }

    public int getInt(String key, int defValues) {
        return sp.getInt(key, defValues);
    }

    public void putString(String key, String values) {
        editor.putString(key, values);
        editor.commit();
    }

    public String getString(String key, String defValues) {
        return sp.getString(key, defValues);
    }

    public void putBoolean(String key, boolean values) {
        editor.putBoolean(key, values);
        editor.commit();
    }

    public boolean getBoolean(String key, boolean defValues) {
        return sp.getBoolean(key, defValues);
    }

    public void deleteKey(String key) {
        editor.remove(key);
        editor.commit();
    }

    public void deleteAll() {
        editor.clear();
        editor.commit();
    }
}

六、利用 Sp 工具类改造上述代码

<font face = 黑体>具体代码如下所示:

public class Share2Activity extends AppCompatActivity {

    private EditText accEdt, pwdEdt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);

        // 这两个初始化放到 Application 中
        ToastUtil.init(this);
        SpUtil.getInstance().initSp(this);

        accEdt = findViewById(R.id.acc_edt);
        pwdEdt = findViewById(R.id.pwd_edt);

        String accStr = SpUtil.getInstance().getString("account", "");
        String pwdStr = SpUtil.getInstance().getString("password", "");

        accEdt.setText(accStr);
        pwdEdt.setText(pwdStr);

        findViewById(R.id.login_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String account = accEdt.getText().toString();
                String password = pwdEdt.getText().toString();
                if (account.equals("123") && password.equals("123")) {

                    SpUtil.getInstance().putString("account", account);
                    SpUtil.getInstance().putString("password", password);

                    ToastUtil.showToast("登录成功");
                } else {
                    ToastUtil.showToast("账号或密码错误");
                }
            }
        });
    }
}

<font face = 黑体>ToastUtil 代码:

public class ToastUtil {

    private static Toast toast;

    public static void showToast(String content) {
        toast.setText(content);
        toast.show();
    }

    public static void init(Context context) {
        toast = Toast.makeText(context, "", Toast.LENGTH_SHORT);
    }
}

Maenj_Ba_lah
28 声望7 粉丝

真正的大师,永远怀着一颗学徒的心。