Android+SQLiteOpenHelper实现登录记住密码小案例

实现自动登录,在数据库中存 注册的账号信息

package com.example.databases_text;import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import java.util.List;import com.example.databases_text.LoginUse.LoginDBHelper;
import com.example.databases_text.LoginUse.LoginUser;public class MainActivity extends AppCompatActivity implements View.OnClickListener ,View.OnFocusChangeListener{private EditText edit_name;private  EditText edit_password;private CheckBox cb_password;private LoginDBHelper loginDBHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);edit_password=findViewById(R.id.et_pws);edit_name=findViewById(R.id.et_name);cb_password=findViewById(R.id.cb_password);findViewById(R.id.btn_register).setOnClickListener(this);findViewById(R.id.btn_login).setOnClickListener(this);edit_password.setOnFocusChangeListener(this);}@Overrideprotected void onStart() {super.onStart();//获得数据库帮助器实例loginDBHelper = LoginDBHelper.getInstance(this);loginDBHelper.openWriteLink();//打开数据库loginDBHelper.openReadLink();reload();}@Overrideprotected void onStop() {super.onStop();loginDBHelper.closeLink();}@Overrideprotected void onDestroy() {super.onDestroy();}@Overridepublic void onClick(View view) {LoginUser user = new LoginUser();String name=edit_name.getText().toString();String psw=edit_password.getText().toString();boolean cb_check=cb_password.isChecked();user.setName(name);user.setPassword(psw);user.setRemeber(cb_check);switch (view.getId()){case R.id.btn_register:if(TextUtils.isEmpty(name)|| TextUtils.isEmpty(psw)){Toast.makeText(MainActivity.this,"密码或用户名为空",Toast.LENGTH_SHORT).show();} else {if (user.getName().equals(loginDBHelper.queryName(name))) {Toast.makeText(this, "账号已存在", Toast.LENGTH_SHORT).show();}else{if (loginDBHelper.registerData(user) > 0)Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();}}break;case R.id.btn_login:user.setName(name);user.setPassword(psw);if(TextUtils.isEmpty(name)|| TextUtils.isEmpty(psw)){Toast.makeText(MainActivity.this,"密码或用户名为空",Toast.LENGTH_SHORT).show();}else {List<LoginUser> userList = loginDBHelper.queryData(user);if (userList != null &&userList.size() > 0){String username = userList.get(0).getName();String userPassword =userList.get(0).getPassword();if (user.getName().equals(username) && user.getPassword().equals(userPassword)){//注意,这里虽然都是String类型,不能直接用==来比较,因为是两个对象,比较的是地址值,Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();loginDBHelper.saveDate(user);}else{Toast.makeText(this,"用户名或密码错误",Toast.LENGTH_SHORT).show();edit_password.setText("");}}else{Toast.makeText(this,"用户名或密码错误",Toast.LENGTH_SHORT).show();}}break;}}public void reload(){LoginUser loginreload=loginDBHelper.reloadDate();if(loginreload!=null && loginreload.isRemeber()){edit_name.setText(loginreload.getName());edit_password.setText(loginreload.getPassword());cb_password.setChecked(loginreload.isRemeber());}else {edit_name.setText("");edit_password.setText("");cb_password.setChecked(false);}}@Overridepublic void onFocusChange(View view, boolean b) {if(view.getId()==R.id.et_pws && b){String x=loginDBHelper.queryPassword(edit_name.getText().toString());edit_password.setText(x);}}
}
package com.example.databases_text.LoginUse;import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;import java.util.ArrayList;
import java.util.List;import com.example.databases_text.User.User;public class LoginDBHelper extends SQLiteOpenHelper {// 数据库版本号public static final int DATABASE_VERSION = 2;// 数据库名称public static final String DATABASE_NAME = "text.db";// 用户表名public static final String TABLE_NAME = "login";// 用户名public static final String COLUMN_NAME = "name";public static final String COLUMN_ID = "id";// 用户密码public static final String COLUMN_PASSWORD = "password";private static LoginDBHelper instance=null;private SQLiteDatabase mRDB=null;private SQLiteDatabase mWDB=null;public LoginDBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}//利用单例模式,获取数据库的唯一实例,当数据库不存在的时候,经行创建,如果已存在就直接返回public static LoginDBHelper getInstance(Context context){if(instance==null){instance=new LoginDBHelper(context);}return  instance;}//打开数据库的读连接public SQLiteDatabase openReadLink(){if(mRDB==null || !mRDB.isOpen()) {mRDB = instance.getReadableDatabase();}return mRDB;}//打开数据库的写连接public SQLiteDatabase openWriteLink(){if(mWDB==null || !mWDB.isOpen()) {mWDB = instance.getReadableDatabase();}return mWDB;}//数据库的关闭操作public void closeLink() {if (mRDB != null && mRDB.isOpen()) {mRDB.close();mRDB = null;}if (mWDB != null && mWDB.isOpen()) {mWDB.close();mWDB = null;//置为空为了回收}}//创建数据库,执行sql语句@Overridepublic void onCreate(SQLiteDatabase sqLiteDatabase) {String sql = "create table if not exists " + TABLE_NAME+ " ("+"id integer primary Key AUTOINCREMENT not null ," +"name VARCHAR not null,"+"password VARCHAR not null,"+"remeber INTEGER not null);";sqLiteDatabase.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {}//添加数据到数据库public long registerData(LoginUser user){ContentValues values = new ContentValues();values.put("name", user.getName());values.put("pasword", user.getPassword());values.put("remeber", user.isRemeber());return   mWDB.insert(TABLE_NAME,null,values);}public long deleteData(LoginUser user){//删除所有的return mWDB.delete(TABLE_NAME,"name=? and pasword=?",new String[]{user.getName(),user.getPassword()});}public long updateData(LoginUser user){ContentValues values = new ContentValues();values.put("name", user.getName());values.put("password", user.getPassword());values.put("remeber", user.isRemeber());//更改所有符合条件的数据return mWDB.update(TABLE_NAME,values,"name=? ",new String[]{user.getName()});}public List<LoginUser> queryData(LoginUser user){List<LoginUser> list = new ArrayList<>();//查询所有数据,得到游标Cursor cursor =mWDB.query(TABLE_NAME,null,"name=? and pasword=?",new String[]{user.getName(),user.getPassword()},null,null,null);//逐个取出游标指向的数据while (cursor.moveToNext()){LoginUser user1=new LoginUser();user1.setName(cursor.getString(1));user1.setPassword(cursor.getString(2));list.add(user1);}return list;}public String queryPassword(String name){String cursor_password=null;//查询所有数据,得到游标Cursor cursor =mWDB.query(TABLE_NAME,null,"name=? and remeber=1 ",new String[]{name},null,null,null);//逐个取出游标指向的数据while (cursor.moveToNext()){cursor_password=cursor.getString(2);}//取出游标指向的数据return cursor_password;}public String queryName(String name){String cuesor_name=null;//查询所有数据,得到游标Cursor cursor =mWDB.query(TABLE_NAME,null,"name=? ",new String[]{name},null,null,null);//逐个取出游标指向的数据while (cursor.moveToNext()){cuesor_name=cursor.getString(1);}//取出游标指向的数据return cuesor_name;}//获取追后的数据public  LoginUser reloadDate(){LoginUser loginreload=new LoginUser();String sql="select * FROM "+TABLE_NAME+" ORDER BY id DESC limit 1";Cursor cursor= mRDB.rawQuery(sql,null);if(cursor.moveToNext()) {loginreload.setId(cursor.getInt(0));loginreload.setName(cursor.getString(1));loginreload.setPassword(cursor.getString(2));boolean result = cursor.getInt(3) != 0;Log.d("TAG", "reloadDate: "+result);loginreload.setRemeber(result);}return loginreload;}public void saveDate(LoginUser loginUser){/*** 事物:若事件没有按照正确的逻辑进行,则整件事情直接失败*/try{mWDB.beginTransaction();//事物开始时的标志性
//进行一系列操作deleteData(loginUser);registerData(loginUser);mWDB.setTransactionSuccessful();//若一切正常,则设置事物成功的标准吗,若不正常,则不提交}catch (Exception e){e.printStackTrace();}finally {mWDB.endTransaction();//无论是否成功,结束事物}}
}
package com.example.databases_text.LoginUse;public class LoginUser {private int id;private  String name;private String password;private  boolean remeber=false;public LoginUser() {}public LoginUser(String name, String password, boolean remeber) {this.name = name;this.password = password;this.remeber = remeber;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public boolean isRemeber() {return remeber;}public void setRemeber(boolean remeber) {this.remeber = remeber;}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="用户名"/><EditTextandroid:id="@+id/et_name"android:layout_width="match_parent"android:layout_height="wrap_content"/><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="密码"/><EditTextandroid:id="@+id/et_pws"android:layout_width="match_parent"android:layout_height="wrap_content"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><CheckBoxandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_weight="1"android:text="记住密码"android:id="@+id/cb_password"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="注册"android:id="@+id/btn_register"/><Buttonandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:text="登录"android:id="@+id/btn_login"/></LinearLayout>
</LinearLayout>

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

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

相关文章

运维行业中的堆叠交换机监控与配置管理策略

随着信息技术的迅猛发展&#xff0c;企业网络架构日趋复杂&#xff0c;交换机作为网络基础设施的核心设备&#xff0c;其稳定性和安全性对于企业业务的运行至关重要。在运维实践中&#xff0c;堆叠交换机&#xff08;Stacked Switches&#xff09;因其高可靠性、灵活扩展性等特…

SM2258G专用SSD开卡工具(三星闪存),后附工具下载

工具下载&#xff1a; https://download.csdn.net/download/weixin_43097956/89354302

「贪心算法」柠檬水找零

力扣原题链接&#xff0c;点击跳转。 假设你的手里没有钱。你要卖柠檬水&#xff0c;每杯5块钱。每个顾客有可能会给你5块钱、10块钱或20块钱&#xff0c;你要拿手中的钱找零。如何判断你能否成功找零呢&#xff1f; 如果一上来就有顾客花10块钱或20块钱&#xff0c;你手中没…

python中特殊的静态方法__new__

一、关于new方法 在Python中&#xff0c;__new__方法是一个特殊的静态方法&#xff0c;用于实例化对象。通常不需要直接调用__new__方法&#xff0c;Python会自动调用它来分配内存空间并返回一个新对象&#xff08;或者更具体地说&#xff0c;是对象的引用&#xff09;。然而&…

视频怎么转换成二维码图片?视频做成二维码播放的方法

怎样在电脑上制作可以播放视频的二维码呢&#xff1f;很多日常生活中&#xff0c;很多的场景或者物品都会有自己的二维码&#xff0c;其他人通过扫码就可以获取对应的内容。有很多场景下会把视频转换二维码&#xff0c;通过扫码在手机上查看视频内容&#xff0c;比如产品介绍、…

水表电表远程抄表是什么?

1.简述&#xff1a;水表电表远程抄表技术性 随着时代的发展&#xff0c;传统式手动抄表方法早已被更为高效、智能化的远程抄表系统所替代。水表电表远程抄表&#xff0c;说白了&#xff0c;就是利用互联网技术完成对水表和电表读数的远程数据采集管理方法&#xff0c;大大提升…

效果炸裂!使用 GPT-4o 快速实现LLM OS

▼最近直播超级多&#xff0c;预约保你有收获 —1— 什么是 LLM OS&#xff1f; 关于 LLM OS 的最初构想源自karpathy 在2023年11月11日发布的一条Twitter 动态&#xff0c;这是 LLM OS 概念的最早出处&#xff0c;如下图所示&#xff1a; LLM OS 主要有以下5个部分组成&#x…

基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于SA模拟退火优化算法的TSP问题求解matlab仿真,并对比ACO蚁群优化算法,对比两个算法的仿真时间&#xff0c;收敛曲线&#xff0c;以及路径规划的结果&#xff0…

中间件的概念及示例

什么是中间件&#xff1f; 中间件是一种软件技术&#xff0c;它在分布式系统中起着至关重要的作用。以下是关于中间件的详细解释&#xff1a; 定义与位置&#xff1a; 中间件是位于应用系统和系统软件之间的一类软件。它使用系统软件提供的基础服务&#xff08;功能&#xff0…

Flask+Vue+MySQL天水麻辣烫管理系统设计与实现(附源码 配置 文档)

背景&#xff1a; 同学找到我期望做一个天水麻辣烫的网页&#xff0c;想复用以前做过的课设&#xff0c;结合他的实际需求&#xff0c;让我们来看看这个系统吧~ 项目功能与使用技术概述&#xff1a; 里面嵌入了6个子系统&#xff0c;其中餐饮系统可以进行餐馆信息添加、修改…

TypeScript体操类型练习

历史小剧场 这个世界上&#xff0c;有两种人最痛苦&#xff0c;第一种是身居高位者&#xff0c;第二种是身居底层者&#xff0c;第一种人很少&#xff0c;第二种人很多。第一种人叫崇祯&#xff0c;第二种人叫百姓。 而最幸福的&#xff0c;就是中间那拨人&#xff0c;主要工作…

Influence blocking maximization on networks: Models, methods and applications

abstract 由于各种社会和贸易网络的不断出现&#xff0c;网络影响力分析引起了研究者的极大兴趣。基于不同的影响力传播模型&#xff0c;人们提出了许多网络影响力最大化的新模型和方法。作为传统影响力最大化问题的延伸和扩展&#xff0c;影响力封锁最大化问题已成为研究热点&…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

【图论】单源最短路

前言 今天&#xff0c;我们来讲最短路&#xff0c;首先看只有一个起点&#xff08;单源&#xff09;的情况。 为了书写方便&#xff0c;我们约定以下内容&#xff1a; template<class W> using Graph vector<vector<pair<int, W>>>; // 邻接表(ve…

集中抄表电表是什么?

1.集中抄表电表&#xff1a;简述 集中抄表电表&#xff0c;又称为远程抄表系统&#xff0c;是一种现代化电力计量技术&#xff0c;为提升电力行业的经营效率和客户服务质量。它通过自动化的形式&#xff0c;取代了传统人工抄水表&#xff0c;完成了数据信息实时、精确、高效率…

进制转换【野路子改造】

非科班&#xff0c;一直都是自己的野路子&#xff0c;现在要回炉重造 十进制->二进制 基本思想&#xff1a; 开始写的&#xff08;80%&#xff09;&#xff1a; #include<stdio.h> using namespace std; int main(){ int n; scanf("%d",&n); int a[1…

Spring -- DI

文章目录 一、什么是DI二、注入的三种方式2.1 属性注入 Autowired使用方法Autowired存在的问题以及解决方法Autowired问题的解决方法 2.2 构造方法注入2.3 setter方法注入2.4 三种注入方式优缺点分析 一、什么是DI 概念&#xff1a;DI(依赖注入)就是当我们把依赖对象取出来(创…

以太坊钱包

以太坊钱包是你通往以太坊系统的门户。它拥有你的密钥&#xff0c;并且可以代表你创建和广播交易。选择一个以太坊钱包可能很困难&#xff0c;因为有很多不同功能和设计选择。有些更适合初学者&#xff0c;有些更适合专家。即使你现在选择一个你喜欢的&#xff0c;你可能会决定…

mac m1 pcre.h 找不到

安装suricata报错&#xff1a; configure: error: pcre.h not found ... 解决&#xff1a; brew install pcre 找到这个文件的地址 brew list pcre | grep pcre.h$ /opt/homebrew/Cellar/pcre/8.45/include/pcre.h 程序搜索的地址 cpp -v /Library/Developer/CommandLineT…

5.26 基于UDP的网络聊天室

需求&#xff1a; 如果有人发送消息&#xff0c;其他用户可以收到这个人的群聊信息 如果有人下线&#xff0c;其他用户可以收到这个人的下线信息 服务器可以发送系统信息实现模型 模型&#xff1a; 代码&#xff1a; //chatser.c -- 服务器端实现 #include <stdio.h>…