安卓基础学习 Day27 |数据存储-SharedPreferences

写在前面的话

1、主要参考自:https://b23.tv/Xqlo6e
2、内容如果有不对的,希望可以指出或补充。
3、新知识。

一、概述

SharedPreferences(共享参数):Android系统提供的一个轻量级的存储类,适用于存储数量较少的场合(如存取一些长期保存到手机客户端信息,用户个性化设置的字体等参数信息)。以键值对(值只能是int、long、boolean、String和float基本的数据类型)的方式存储在一个XML文件中(文件存放目录:/data/data/应用程序包名/shared_prefs/*.xml),存储在内存。

应用程序卸载后,文件也会被删除。

二、使用

文件名不存在就会创建一个,操作模式有两种:

  • Context.MODE_PRIVATE(或0):【默认操作模式】,直接在把第二个参数写0就是默认使用这种操作模式,代表该文件是私有数据,只能被应用本身访问,写入的内容会覆盖原文件的内容
  • Context.MODE_MULTI_PRIVATE(或32768):用于多个进程共同操作一个SharedPreferences文件,检查该文件名对应的文件存在就在其中追加内容,否则创建新文件。

注:MODE_WORLD_READABLE(或1)[当前文件可以被其他应用读取]和MODE_WORLD_WRITEABLE(或2)[当前文件可以被其他应用写入] 这两种模式已经在【Android4.2版本以后】废弃了。

(一)存储数据

// 1、通过调用内置函数(Context对象的)getSharedPreferences创建对象:可以被同一应用程序下的其他组件共享
//另:调用Activity对象的getPreferences()方法:获得的SharedPreferences对象只能在该Activity中使用,会自动将当前类名作为文件名,只需要传入操作模式即可
SharedPreferences sp = getSharedPreferences(文件名,操作模式);
//2、获取SharedPreferences的编辑器,调用edit()方法
//使文件处于可编辑状态
SharedPreferences.Editor editor = sp.edit();
//3、调用编辑器的putXXX(String key,xxx value)方法存入数据
//将数据放于编辑器中
editor.putString(String key, String value);
//4、提交存入的值
//也可用editor.commit();方法
editor.apply();

//补充:editor.clear();-----》清除数据

【两种提交方式区别】

  • apply (): 异步处理。会先写入内存,然后异步写入磁盘。推荐使用这个。
  • commit(): 有返回值。直接写入磁盘。仅当需要立刻确定提交结果,并据此做相应的其他操作时,推荐用。

(二)读取数据

// 1、通过调用内置函数(Context对象的)getSharedPreferences创建对象
SharedPreferences sp = getSharedPreferences(文件名,操作模式);
//2、调用编辑器的getXXX(String key,xxx default)方法读取数据
sp.getString(String key, String default);

三、测试

在【安卓基础练习 02 |登录注册】的基础上进行的。
功能:勾选记住用户和密码复选框后,再次进入app就会自动写入用户名和密码。

布局

实现代码

在LoginActivity.java文件中:

package com.example.tasktwo;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class LoginActivity extends AppCompatActivity {
    //声明控件变量
    private EditText edtName, edtPwd;
    private Button btnLogin, btnCancel;
    private CheckBox testSharedPreferences;

    /**
     * 新添部分-SharedPreferences
     */
    private SharedPreferences sp; // 声明共享参数
    private SharedPreferences.Editor editor; // 声明编辑器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //加载登录布局页面
        setContentView(R.layout.login_activity);
        //获取相应控件
        edtName = findViewById(R.id.edt_username);
        edtPwd = findViewById(R.id.edt_password);
        btnLogin = findViewById(R.id.btn_login);
        btnCancel = findViewById(R.id.btn_cancel_login);
        testSharedPreferences = findViewById(R.id.test_sharedpreferences);//获取控件

        /** 在onCreate()方法外声明SharedPreferences、SharedPreferences.Editor的全局变量
         * 新添部分-SharedPreferences
         * 公共部分
         */
        sp = getSharedPreferences("data",0);//1步
        /**
         * 读取数据的实现
         */
        edtName.setText(sp.getString("name",""));//2步
        edtPwd.setText(sp.getString("pwd",""));
        /**
         *======================================
         */
         
        ///登录事件
        btnLogin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String name = edtName.getText().toString().trim();
                String pwd = edtPwd.getText().toString().trim();

                if(name.equals("admin") && pwd.equals("admin")){
                    // Toast.LENGTH_SHORT大概显示时间为1秒,Toast.LENGTH_LONG大概显示时间为3秒
                    Toast.makeText(LoginActivity.this,"恭喜,用户名与密码正确!",
                            Toast.LENGTH_SHORT).show();

                    /**
                     * 新添部分-SharedPreferences
                     * 判断是否勾选了记住用户名和密码
                     * 存储数据的实现
                     */
                    if(testSharedPreferences != null){
                        editor = sp.edit();//2步
                        editor.putString("name",name);//3步
                        editor.putString("pwd",pwd);
                        editor.apply();//4步
                    }
                    /**
                    *======================================
                    */

                    Intent intent_l = new Intent(LoginActivity.this,LoginMessage.class);
                    //封装数据
                    Bundle usrData =new Bundle();
                    usrData.putString("l_name",name);
                    //携带数据包
                    intent_l.putExtras(usrData);
                    //启动目标组件
                    startActivity(intent_l);

                }else{
                    Toast.makeText(LoginActivity.this,"遗憾,用户名或密码错误!请重新输入",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
        //取消事件,也就是关闭当前界面
        btnCancel.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

查看文件中存储的数据

效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值