安卓---第5章 数据存储---保存QQ账号与密码

news2024/9/28 3:25:03

文章目录

  • 案例1: 使用文件存储 保存QQ账号与密码
    • 功能描述
    • saveqq_1.xml
    • FileSaveQQ.java
    • saveqq_1
  • 案例2 使用SP保存QQ账号与密码
    • 功能描述
    • SPSaveQQ.java
    • 其他代码
  • 1. 数据存储方式
  • 2. 文件存储
    • 将数据存入文件中
      • 内部存储:
      • 外部存储:
    • 从文件中读取数据
      • 读取内部存储
      • 读取外部存储
        • 静态申请权限
        • 动态申请权限
  • 3. SharedPreferences 存储
    • 将数据存入SP中
    • 读取与删除数据

案例1: 使用文件存储 保存QQ账号与密码

功能描述

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

saveqq_1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#E6E6E6"
    android:orientation="vertical"
    android:padding="10dp">

    <!--    头像-->
    <ImageView
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="30dp"
        android:src="@drawable/zh_21" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:background="@color/white"
        android:orientation="horizontal">
        <!--        TextView控件用于显示"账号"、"密码"的文本信息-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="账号"
            android:textColor="#000"
            android:textSize="20sp" />
        <!--EditText用于输入账号、密码的输入框-->
        <EditText
            android:id="@+id/et_account"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:padding="10dp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:background="@color/white"
        android:orientation="horizontal">
        <!--        TextView控件用于显示"账号"、"密码"的文本信息-->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="密码"
            android:textColor="#000"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/et_password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="5dp"
            android:background="@null"
            android:inputType="textPassword"
            android:padding="10dp" />
    </LinearLayout>
    <!--    登录按钮-->
    <Button
        android:id="@+id/btn_login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="25dp"
        android:background="#3C8DC4"
        android:text="登录"
        android:textColor="@color/white"
        android:textSize="20sp" />
</LinearLayout>

FileSaveQQ.java

package com.example.chapter5.saveqq;

import android.content.Context;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

//    实现qq账号、密码的存储与读取
public class FileSaveQQ {
    /**
     * saveUserInfo() 该方法用于 保存QQ账号和密码到data.txt文件中
     *
     * @param context
     * @param account
     * @param password
     * @return
     */
    public static boolean saveUserInfo(Context context, String account, String password) {
        FileOutputStream fos = null;
        try {
            /**
             * 调用openFileOutput()方法
             * 来获取文件的输出流对象fos
             */
            fos = context.openFileOutput("data.txt", Context.MODE_PRIVATE);
            /**
             * 调用write方法,获取用户输入的账号、密码的字节
             * 将数据转换为字节码的形式写入data.txt文件中
             */
            fos.write((account + ":" + password).getBytes());
            return true;    //保存数据成功
        } catch (Exception e) {
            e.printStackTrace();
            return false;   //保存数据失败
        } finally {
            //调用close()方法,关闭输出流fos
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 从data.txt文件中获取存储的QQ账号和密码
     *
     * @param context
     * @return
     */
    public static Map<String, String> getUserInfo(Context context) {
        String content = "";
        FileInputStream fis = null;
        try {
            // 调用openFileInput()方法
            // 获取文件的输入流对象fis
            fis = context.openFileInput("data.txt");
            // 调用available()方法 获取文件长度,并以这个长度创建字节数组buffer
            // 将输入流对象中的数据转换为字节码的形式
            byte[] buffer = new byte[fis.available()];
            //通过read()方法读取字节中数据,将数据读取到buffer对象中
            fis.read(buffer);
            //将获取的字节码 buffer对象 转换为String类型的字符串
            content = new String(buffer);
            Map<String, String> userMap = new HashMap<String, String>();
            //将字符串以":"分隔后,形成一个字符串数组
            String[] infos = content.split(":");
            //数组中的第一个数据放入userMap集合中(第一个数据就是账号)
            userMap.put("account", infos[0]);
            //数组中的第二个数据放入userMap集合中(第二个数据是密码)
            userMap.put("password", infos[1]);
            //这个集合中就存放用户的账号和密码
            return userMap;
        } catch (Exception e) {
            //如果获取失败,程序执行catch代码块
            e.printStackTrace();
            return null;
        } finally {
            //最后执行finally代码块
            try {
                //调用close()方法关闭输入流对象fis
                if (fis != null) {
                    fis.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}

saveqq_1

package com.example.chapter5.saveqq;

import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import com.example.chapter5.R;

import java.util.Map;

public class saveqq_1 extends AppCompatActivity implements View.OnClickListener {
    private EditText et_account;    //账号输入框
    private EditText et_password;   //密码输入框
    private Button btn_login;   //登陆按钮

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.saveqq_1);
        initView();
        //通过工具类FileSaveQQ中的getUserInfo方法获取QQ账号、密码
        Map<String, String> userInfo = FileSaveQQ.getUserInfo(this);
        if (userInfo != null) {
            //将获取的账号、密码显示到界面上
            et_account.setText(userInfo.get("account"));
            et_password.setText(userInfo.get("password"));
        }
    }

    private void initView() {
        et_account = (EditText) findViewById(R.id.et_account);
        et_password = (EditText) findViewById(R.id.et_password);
        btn_login = (Button) findViewById(R.id.btn_login);
        //设置按钮的点击监听事件
        btn_login.setOnClickListener(this);
    }


    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_login:
                //当点击登录按钮时,获取界面上输入的QQ账号和密码
                String account = et_account.getText().toString().trim();
                String password = et_password.getText().toString();
                //检验输入的账号和密码是否为空
                if (TextUtils.isEmpty(account)) {
                    Toast.makeText(this, "请输入QQ账号", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (TextUtils.isEmpty(password)) {
                    Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
                    return;
                }
                Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
                //保存用户信息
                boolean isSaveSuccess = FileSaveQQ.saveUserInfo(this, account, password);
                if (isSaveSuccess) {
                    Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}

案例2 使用SP保存QQ账号与密码

功能描述

在这里插入图片描述

SPSaveQQ.java

package com.example.chapter5.saveqq;

import android.content.Context;
import android.content.SharedPreferences;

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

//通过SharedPreferences来存储与读取信息
public class SPSaveQQ {
    //保存QQ账号和登录密码到data.xml文件中
    public static boolean saveUserInfo(Context context, String account,
                                       String password) {
        //通过getSharedPreferences()获取SharedPreferences这个类的对象sp
        SharedPreferences sp = context.getSharedPreferences("data",
                Context.MODE_PRIVATE);
        //通过edit()方法获取编辑类Editor对象edit
        SharedPreferences.Editor edit = sp.edit();
        //将账号、密码添加到edit中
        edit.putString("userName", account);
        edit.putString("pwd", password);
        //commit()提交数据 提交到data.xml中
        edit.commit();
        return true;
    }

    //从data.xml文件中获取存储的QQ账号和密码
    public static Map<String, String> getUserInfo(Context context) {
        SharedPreferences sp = context.getSharedPreferences("data",
                Context.MODE_PRIVATE);
        //获取账号、密码
        String account = sp.getString("userName", null);
        String password = sp.getString("pwd", null);
        //将获取的账号、密码存放在Map集合中
        Map<String, String> userMap = new HashMap<String, String>();
        userMap.put("account", account);
        userMap.put("password", password);
        return userMap;
    }
}

其他代码

xml中的代码不变,

savaqq_1.java中的代码只需要修改

onCreate()中的在这里插入图片描述

和onClick()中的
在这里插入图片描述

1. 数据存储方式

在这里插入图片描述
本章重点:文件存储、SharedPreferences、SQLite数据库

2. 文件存储

将数据存入文件中

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

内部存储:

在这里插入图片描述

外部存储:

在这里插入图片描述

从文件中读取数据

读取内部存储

在这里插入图片描述

读取外部存储

在这里插入图片描述

静态申请权限

在这里插入图片描述

动态申请权限

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

3. SharedPreferences 存储

将数据存入SP中

在这里插入图片描述

读取与删除数据

在这里插入图片描述
关于key值的注意点:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/354153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统服务管理

一、信息系统服务业及发展二、信息系统工程监理的概念及发展三、信息系统运行维护的概念和发展 IT服务管理&#xff08;ITSM) 四、信息技术服务管理的标准和框架 IT服务标准体系&#xff08;ITSS&#xff09; 一、信息系统服务业及发展 总结&#xff1a;前景很好 二、信息系…

计网传输层协议:UDP和TCP

文章目录一. 应用层和传输层的联系二. UDP协议三. TCP协议1. TCP报头介绍2. TCP实现可靠传输的核心机制2.1 确认应答2.2 超时重传3. 连接管理(三次握手, 四次挥手)3.1 建立连接(三次握手)3.2 断开连接(四次挥手)4. 滑动窗口5. 流量控制6.拥塞控制7. 延时应答8. 捎带应答9. 面向…

5.InfluxDB定时任务与报警

定时任务 InfluxDB的定时任务本质上是定时执行一个Flux脚本,一般回先查询数据再聚合修改最后可以写回另外一个bucket中 常用的定时任务使用场景 降采样 : 如果数据的输入频率特别快比如IOT温度计设备每秒往InfluxDB写入一条数据会有大量的数据写入一个InfluxDB的bucket (因为…

kubernetes教程 --Pod详解

Pod详解 每个Pod中都可以包含一个或者多个容器&#xff0c;这些容器可以分为两类&#xff1a; 用户程序所在的容器&#xff0c;数量可多可少 Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个&#xff1a; 可以以它为依据&#xff0c;评估整个…

ADS仿真,3db均衡器是否可以补偿3db插入损耗?

背景高速信号走线经常会有走线超长的问题&#xff0c;走线过长带来的直接影响是对应的插入损耗IL会增加&#xff0c;当超过标准要求时需增加Redriver等补偿&#xff0c;最常用的调整时增加预加重和去加重。而调整预加重时首先遇到的一个问题是补偿多少db?是否3db的均衡就可以补…

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

摘要 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 一、双指针解析 考虑定义双指针 i , j分列数组左右两端&#xff0c;循环执行&#xff1a; 指针 i从左向右寻找偶数&#xff1b;指针 j从右向左寻找奇数&#xff1b;将偶数nums[i]和奇数 nums[j]交换。 可始终保证&…

C#:Krypton控件使用方法详解(第六讲) ——kryptonTextBox

今天介绍的Krypton控件中的kryptonTextBox&#xff0c;下面开始介绍这个控件的属性&#xff1a;首先介绍的是外观属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;Lines属性&#xff1a;表示在显示…

HTML转EXE工具(HTML App Build)最新版

HTML转EXE工具&#xff08;HTM2EXE&#xff09;最初发布于2022-08-17。可以将Web前端转换成Windows32或者64的EXE执行程序。当时由于时间紧&#xff0c;未能进行优化&#xff0c;特别是浏览器采用的是IE内核&#xff0c;所以使用起来会有一些兼容性问题&#xff0c;当时就记录了…

万字长文讲述由ChatGPT反思大语言模型的技术精要

文&#xff5c;张俊林 源&#xff5c;知乎张俊林 导读&#xff1a;ChatGPT出现后惊喜或惊醒了很多人。惊喜是因为没想到大型语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;效果能好成这样&#xff1b;惊醒是顿悟到我们对LLM的认知及发展理念&#xff0c…

机器学习笔记

一 1.类型 有监督&#xff1a;分类、回归 无监督&#xff1a;聚类、降维 2.挑战&#xff1a; 过拟合&#xff1a;泛化能力弱 欠拟合&#xff1a;模型过于简单 二、 1.开发流程 数据收集->数据清洗->特征工程->数据建模 2.选择性能指标&#xff1a; 回归问题 均方根…

node-sass@4.14.1 包含风险, 如何升级依赖至 dart-sass

文章目录需求我上网都查到了哪些信息在 github 看到了 node-sass 依赖的最新版本的列表&#xff1a;关于方案2的失败不同版本的 nodejs 和 node-sass依赖的**适配关系**从何得知替代方案——dart-sass如何安装 dart sass&#xff1f;需求 在做一个基于Node、React的前端项目&a…

这才是打开Java面试的正确方式,金三银四互联网大厂Java面试八股来袭

前言 招聘旺季已经到了&#xff0c;不知道大家是否准备好了&#xff0c;面对金三银四的招聘旺季&#xff0c;如果没有精心准备那笔者认为那是对自己不负责任&#xff1b;就我们 Java 程序员来说&#xff0c;多数的公司总体上面试都是以自我介绍项目介绍项目细节/难点提问基础知…

【LeetCode】剑指 Offer(3)

目录 写在前面&#xff1a; 题目&#xff1a;剑指 Offer 09. 用两个栈实现队列 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 写在前面&…

追光进行时:沿着全光运力的新航道,加速驶向算力时代

2021年&#xff0c;工信部印发《新型数据中心发展三年行动计划&#xff08;2021—2023年&#xff09;》&#xff0c;明确指出“用3年时间&#xff0c;形成总体布局持续优化&#xff0c;全国一体化算力网络国家枢纽节点、省内数据中心、边缘数据中心梯次布局”&#xff0c;“算力…

LeetCode230218_148、654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums 构建的 最大二叉树…

页面置换算法

页面置换算法 在进程运行过程中&#xff0c;若需要访问的物理块不在内存中&#xff0c;就需要通过一定的方式来将页面载入内存&#xff0c;而此时内存很可能已无空闲空间&#xff0c;因此就需要一定的算法来选择内存中要被置换的页面&#xff0c;这种算法就被称为页面置换算法…

redis容器部署及相关配置文件解释

背景&#xff1a;我们项目上的redis除了几个核心业务的集群部署是用二进制部署的&#xff0c;其他环境基本都是容器部署。所以整理了一下redis容器相关的配置。docker-compose部署的配置version: 3services:redis:image: redis:6.2.5container_name: redisrestart: alwaysports…

springmvc+jsp电影院购票售票选座推荐网站java ssm

本电影购票推荐网站以SSM作为框架&#xff0c;B/S模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;个人中心、用户管理、电影信息管理、电影类型管理、影院信息管理、系统管理、订单管理等模块&#xff0c;通过这些模块的实现能够基本满足日常电影购…

mysql 时区设置

方法一&#xff1a;修改 mysql 的配置文件永久设置时区&#xff08;优点&#xff1a;永久保存设置&#xff0c;缺点&#xff1a;需重启MySQL服务&#xff09;找到你MySQL的安装目录&#xff08;如果不记得安装在哪 可以输入show variables like “%char%”; 查看&#xff09;&a…

第四章SpringBoot之Web开发

文章目录SpringBoot Web开发总览要解决的问题SpringMVC自动配置原理Web开发静态资源处理第一种静态资源处理webjar第二种静态资源映射规则自定义静态资源路径首页处理内容协商视图解析器测试转换器和格式化器修改SpringBoot的默认配置原理分析全面接管SpringMVC关于国际化处理配…