乐趣区

关于android:Android-本地数据存储之-SharePreferences-存储

一、前言

<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 = 黑体 > 咱们要实现的案例如下所示:

<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);
    }
}
退出移动版