数据存储/访问 之 SharedPreferences(偏好设定)

SharedPreferences 简介

  • SharedPreferences(偏好设定)——保存用户偏好参数,注意不适合存在大数据!
  • 当应用想要保存用户的一些偏好参数,比如是否自动登陆?是否记住账号密码?是否在 Wifi 下才能联网?以及登录的账号密码等等相关信息,此时如果使用数据库,会显得有点大材小用!
  • 把上面这些配置信息称为用户的偏好设置,这些配置信息通常是保存在特定的文件中,比如 windows 使用 ini 文件, 而 Java 中通常使用 properties 属性文件或 xml 文件。
  • Android 中通常使用 一个轻量级的存储类——SharedPreferences 来保存用户的偏好参数,SharedPreferences 也是使用 xml 文件,然后类似于 Map 集合,使用 键—值 形式来存储数据,方便存取。
  • SharedPreferences 的数据存储在应用的私有目录下,除非是卸载 APP,否则数据就一直在的。
  • SharedPreferences  使用简要流程图:

代码演示

  • 需求效果如下,第一次设置时,输入框为空,必须用户手动输入账号与密码,再点击 "保存" 按钮进行保存,保存成功之后关掉 APP ,再次打开 APP 时数据自动进行回显。

  • 布局文件 activity_main.xml 文件内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/userName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="账号" />

    <EditText
        android:id="@+id/userPass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="密码"
        android:inputType="textPassword" />

    <Button
        android:id="@+id/buttonLogin"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存" />
</LinearLayout>
  • 偏好设定帮助类 SharedHelper.java 文件内容如下:
package com.lct.www.yuan.helper;

import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Map;

/**
 * SharedPreferences(偏好设定帮助类)
 */
public class SharedHelper {

    /**
     * 应用环境上下文
     */
    private Context context;

    public SharedHelper(Context context) {
        this.context = context;
    }

    /**
     * 保存偏好设定数据
     *
     * @param userName :账号
     * @param userPass : 密码
     */
    public void saveUserData(String userName, String userPass) {
        /**
         * getSharedPreferences(String name, @PreferencesMode int mode)
         * name=loginData :偏好设定的文件名,不要写文件格式,SharedPreferences 会自动处理,文件不存在时会自动创建
         * Context.MODE_PRIVATE:文件模式,private(私有模式),表示这些偏好设定数据只能本应用使用,或者同一个用户 ID 的应用相互访问
         * 此种模式下,如果 key 已经存在,则覆盖,即更新,否则不存在时,则添加
         */
        SharedPreferences sharedPreferences = context.getSharedPreferences("loginData", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("userName", userName);
        editor.putString("userPass", userPass);
        editor.commit();
        Toast.makeText(context, "数据写入 SharedPreference", Toast.LENGTH_SHORT).show();
    }

    /**
     * 读取偏好设定数据
     *
     * @return
     */
    public Map<String, String> readUserData() {
        Map<String, String> data = new HashMap<>();
        /**
         * getSharedPreferences(String name, @PreferencesMode int mode)
         * name=loginData :偏好设定的文件名,不要写文件格式,SharedPreferences 会自动处理
         * Context.MODE_PRIVATE:文件模式,private(私有模式),表示这些偏好设定数据只能本应用使用,或者同一个用户 ID 的应用相互访问
         */
        SharedPreferences sharedPreferences = context.getSharedPreferences("loginData", Context.MODE_PRIVATE);
        /**
         * getString(String key, @Nullable String defValue):取值
         * 当值不存在时,默认为空
         */
        data.put("userName", sharedPreferences.getString("userName", ""));
        data.put("userPass", sharedPreferences.getString("userPass", ""));
        return data;
    }
}
  • 主活动 MainActivity.java 文件内容如下:
package com.lct.www.yuan;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.lct.www.yuan.helper.SharedHelper;

import java.util.Map;

import static android.widget.Toast.LENGTH_SHORT;

public class MainActivity extends AppCompatActivity {

    private Context context;
    private SharedHelper sharedHelper;
    private EditText editTextUserName;
    private EditText editTextUserPass;
    private Button buttonLogin;

    /**
     * 活动被创建时触发
     *
     * @param savedInstanceState
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.i("Wmx logs::", "活动创建...");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        context = getApplicationContext();
        sharedHelper = new SharedHelper(context);
        bindViews();
    }

    /**
     * 活动为用户可见时触发——读取偏好设定数据进行回显,不存在时显示为空
     */
    @Override
    protected void onStart() {
        Log.i("Wmx logs::", "活动显示...");
        super.onStart();
        Map<String, String> data = sharedHelper.readUserData();
        editTextUserName.setText(data.get("userName"));
        editTextUserPass.setText(data.get("userPass"));
    }

    /**
     * 当活动被销毁时触发
     */
    @Override
    protected void onDestroy() {
        Log.i("Wmx logs::", "活动销毁...");
        super.onDestroy();
    }

    /**
     * 视图绑定
     */
    private void bindViews() {
        editTextUserName = findViewById(R.id.userName);
        editTextUserPass = findViewById(R.id.userPass);
        buttonLogin = findViewById(R.id.buttonLogin);

        /**
         * 当登录按钮被单击时进入,当 账号 、秘密 不为空时,保存数据
         */
        buttonLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String userName = editTextUserName.getText().toString();
                String userPass = editTextUserPass.getText().toString();
                if (userName == null || "".equals(userName)) {
                    Toast.makeText(context, "账号不能为空", LENGTH_SHORT).show();
                    return;
                }
                if (userPass == null || "".equals(userPass)) {
                    Toast.makeText(context, "秘密不能为空", LENGTH_SHORT).show();
                    return;
                }
                sharedHelper.saveUserData(userName, userPass);
            }
        });
    }
}

猜你喜欢

转载自blog.csdn.net/wangmx1993328/article/details/82907376