SQLiteOpenHelper
作用:
用于管理数据库链接
两个方法:
- (1) onCreate
- (2) onUpgrade
SQLiteDatabase
作用:
相当于数据库/链接
分类:
ReadableDatabase、WritableDatabase
如何获取:
通过SQLiteOpenHeIper获取
execSQL
作用:
执行数据库语句
使用:
编写完整的SQL语句,然后执行
缺陷:
- (1) 对于SQL语句要求高
- (2) 没有返回值
insert、delete、update、 query
insert:
- (1) insert参数的意义
- (2) ContentValues
- (3) insert翻译成SQL语句
delete:
- (1) delete参数的意义
- (2) delete翻译成SQL语句
update:
- (1) update参数的意义
- (2) update翻译成SQL语句
query:
- (1) query参数的意义
- (2) query翻译成SQL语句
保存密码进阶版
- SharedPreferences自动保存密码的缺点
- SQLite数据版本自动保存密码
SD卡文件操作
SD卡文件操作的实质:
使用流进行文件读写
权限申请:
- (1) MOUNT_UNMOUNT_FILESYSTEMS:创建和删除文件权限
- (2) WRITE_EXTERNAL_STORAGE
- (3) READ_EXTERNAL_STORAGE
几个重要的方法:
- (1) getExternaIStorageState:获取SD卡状态
- (2) getRootDirectory:获取Android Root路径
- (3) getDataDirectory:获取data目录
- (4) getDownloadCacheDirectory:获取缓存目录
使用流完成读写操作
ContentProvider
什么是ContentProvider?
用于提供外部应用访问本应用数据库的接口
自定义ContentProvider
什么是ContentResolver?
用于访问其他应用程序数据的类
使用ContentResolver
代码部分:
part1:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="showSQLite"
android:text="演示SQLite"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button4"
android:layout_width="match_parent"
android:layout_height="50dp"
android:onClick="showRememberPwd"
android:text="演示记住密码功能"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
activity_db_demo.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".DBDemoActivity">
<EditText
android:id="@+id/username"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="100dp"
android:ems="10"
android:hint="请输入用户名"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/password"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="@+id/username"
app:layout_constraintStart_toStartOf="@+id/username"
app:layout_constraintTop_toBottomOf="@+id/username" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:onClick="writeData"
android:text="写入"
app:layout_constraintStart_toStartOf="@+id/password"
app:layout_constraintTop_toBottomOf="@+id/password" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="readData"
android:text="读取"
app:layout_constraintEnd_toEndOf="@+id/password"
app:layout_constraintTop_toTopOf="@+id/button2" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
UserDBHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class UserDBHelper extends SQLiteOpenHelper {
//数据库版本号
private static final int VERSION = 1;
//数据库的名称
public static final String DB_NAME = "demo";
/**
* 简化后的DBHelper
* @param context
*/
public UserDBHelper(@Nullable Context context) {
super(context, DB_NAME, null, VERSION);
}
/**
* 构造方法
* @param context 上下文
* @param name 数据库的名字
* @param factory 游标的创建方式,没有特殊要求,传null
* @param version 创建时数据库的版本号,版本号只能往上升,不能往下降
*/
public UserDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
/**
* 第一次初始化数据库时自动回调的函数,通常在这里会做一些数据库表的创建等
* @param db
*/
@Override
public void onCreate(SQLiteDatabase db) {
//创建初始化的数据表
String sql = "create table if not exists t_user(id integer primary key autoincrement, username varchar not null, password varchar not null)";
db.execSQL(sql);
}
/**
* 在数据库版本更新的时候自动回调的函数,通常在这里做一些更新数据库表的操作
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
User.java
public class User {
private int id;
private String username;
private String password;
public User(int id, String username, String password) {
this.id = id;
this.username = username;
this.password = password;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
user_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/userId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<TextView
android:id="@+id/username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<TextView
android:id="@+id/password"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="TextView" />
<Button
android:id="@+id/deleteButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="删除" />
<Button
android:id="@+id/editButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="编辑" />
</LinearLayout>
效果图:
activity_user_list.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".UserListActivity">
<ListView
android:id="@+id/userList"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
activity_user_edit.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".UserEditActivity">
<EditText
android:id="@+id/username"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="100dp"
android:ems="10"
android:hint="请输入用户名"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/password"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="@+id/username"
app:layout_constraintStart_toStartOf="@+id/username"
app:layout_constraintTop_toBottomOf="@+id/username" />
<Button
android:id="@+id/saveButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:text="保存"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/password" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
UserEditActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class UserEditActivity extends AppCompatActivity {
private EditText username;
private EditText password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_edit);
username = findViewById(R.id.username);
password = findViewById(R.id.password);
Intent intent = getIntent();
String usernameString = intent.getStringExtra("username");
String passwordString = intent.getStringExtra("password");
final int id = intent.getIntExtra("id", 0);
username.setText(usernameString);
password.setText(passwordString);
findViewById(R.id.saveButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 保存数据
UserDBHelper userDBHelper = new UserDBHelper(UserEditActivity.this);
SQLiteDatabase database = userDBHelper.getWritableDatabase();
/*
* String table->表名
* ContentValues values->更新的字段
* String whereClause->where后面的条件
* String[] whereArgs->where后面的条件的参数
* */
ContentValues contentValues = new ContentValues();
contentValues.put("username", username.getText().toString());
contentValues.put("password", password.getText().toString());
database.update("t_user", contentValues, "id=?", new String[]{""+id});
finish();
}
});
}
}
UserAdapter.java
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class UserAdapter extends BaseAdapter {
private List<User> data;
private Context context;
private LayoutInflater inflater;
public UserAdapter(List<User> data, Context context) {
this.data = data;
this.context = context;
this.inflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.user_item, null);
viewHolder = new ViewHolder();
viewHolder.userId = convertView.findViewById(R.id.userId);
viewHolder.username = convertView.findViewById(R.id.username);
viewHolder.password = convertView.findViewById(R.id.password);
viewHolder.button = convertView.findViewById(R.id.deleteButton);
viewHolder.editButton = convertView.findViewById(R.id.editButton);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
final User user = data.get(position);
viewHolder.userId.setText(user.getId()+"");
viewHolder.username.setText(user.getUsername());
viewHolder.password.setText(user.getPassword());
//点击编辑按钮,跳转编辑界面
viewHolder.editButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, UserEditActivity.class);
intent.putExtra("id", user.getId());
intent.putExtra("username", user.getUsername());
intent.putExtra("password", user.getPassword());
context.startActivity(intent);
}
});
//给按钮绑定点击事件,用于删除信息
viewHolder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
UserDBHelper userDBHelper = new UserDBHelper(context);
SQLiteDatabase database = userDBHelper.getWritableDatabase();
/*
* String table->表名
* String whereClause->where后面的条件,例如:delete from t_user where id=1,whereClause就是id=?
* String[] whereArgs->where语句的参数,例如:delete from t_user where id=1,whereArgs就是id=1的1
* */
/*
* 数组的创建:
* 1.String[] demo = new String[10];
* 2.String[] demo = {"xx","xx"};
* 3.String[] demo = new String[]{"xx","xx"};
* */
String id = user.getId()+"";
database.delete("t_user","id=?", new String[]{id});
Toast.makeText(context, "删除成功", Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
class ViewHolder{
public TextView userId;
public TextView username;
public TextView password;
public Button button;
public Button editButton;
}
}
UserListActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class UserListActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_user_list);
// 初始化数据
UserDBHelper userDBHelper = new UserDBHelper(this);
SQLiteDatabase database = userDBHelper.getReadableDatabase();
Cursor cursor = database.query("t_user",null,null,null,null,null,null);
List<User> userList = new ArrayList<>();
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String username = cursor.getString(cursor.getColumnIndex("username"));
String password = cursor.getString(cursor.getColumnIndex("password"));
User user = new User(id,username,password);
userList.add(user);
}
// 初始化ListView
ListView listView = findViewById(R.id.userList);
UserAdapter userAdapter = new UserAdapter(userList, this);
listView.setAdapter(userAdapter);
}
}
DBDemoActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class DBDemoActivity extends AppCompatActivity {
//用户名
private EditText username;
//密码
private EditText password;
//数据库Helper
private UserDBHelper userDBHelper;
private static final String TAG = "DBDemoActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_db_demo);
//初始化数据
this.username = findViewById(R.id.username);
this.password = findViewById(R.id.password);
this.userDBHelper = new UserDBHelper(this);
}
/**
* 写入数据
* @param view
*/
public void writeData(View view){
//向t_user中写数据:1.创建一个t_user,2.执行SQL
// userDBHelper.getReadableDatabase(); //获取读数据库的链接,在磁盘满的情况下,不会报错,只不过只能读取数据
// userDBHelper.getWritableDatabase(); //获取写数据库的链接,在磁盘满的情况下,获取该链接会报错
//获取SQLiteDatabase
SQLiteDatabase sqLiteDatabase = userDBHelper.getWritableDatabase(); //第一次调用的时候,若没有数据库,则会创建数据库
String username = this.username.getText().toString().trim();
String password = this.password.getText().toString().trim();
/*
* execSQL没有返回值,对于SQL语句掌握的比较好的话,可以直接手写SQL来执行
* insert有返回值,简化SQL语句的编写
* */
// String sql = "INSERT INTO t_user (username, PASSWORD) VALUES ('"+username+"','"+password+"')";
// sqLiteDatabase.execSQL(sql);
/*
* String table -> 要插入的数据库表
* String nullColumnHack -> 可以为空的字段名
* ContentValues values -> 插入的数据,key:value,username:"张三"
* */
ContentValues contentValues = new ContentValues();
contentValues.put("username", username); //key:字段名,value:值
contentValues.put("password", password);
long row = sqLiteDatabase.insert("t_user", null, contentValues);
if (row != -1) {
Toast.makeText(this, "插入数据成功", Toast.LENGTH_SHORT).show();
}
sqLiteDatabase.close();
}
/**
* 读取数据
* @param view
*/
public void readData(View view) {
//1.读取数据
SQLiteDatabase database = userDBHelper.getReadableDatabase();
/*
* String table -> 表名
* String[] columns -> 字段名,若为null,则查询所有的,即*
* String selection -> where语句后面的条件,比如:SELECT * FROM t_user WHERE id = 1; selection就是id=?
* String[] selectionArgs -> where条件的值,比如:SELECT * FROM t_user WHERE id = 1; selectionArgs就是new String[]{"1"}
* String groupBy -> 分组,groupBy
* String having -> having
* String orderBy -> 排序
*
* */
// select * from t_user
Cursor cursor = database.query("t_user", null, null, null, null, null, null);
List<User> userList = new ArrayList<>();
while(cursor.moveToNext()) {
int index = cursor.getColumnIndex("id");
int id = cursor.getInt(index);
String username = cursor.getString(cursor.getColumnIndex("username"));
String password = cursor.getString(cursor.getColumnIndex("password"));
User user = new User(id, username, password);
userList.add(user);
}
//2.跳转界面展示
Intent intent = new Intent(this, UserListActivity.class);
// intent.putExtra("userList", userList);
startActivity(intent);
}
}
效果图:
part2:
MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
* 用于演示SQLites数据库的使用
* @param view
*/
public void showSQLite(View view){
Intent intent = new Intent(this, DBDemoActivity.class);
startActivity(intent);
}
/**
* 用于演示记住密码功能
* @param view
*/
public void showRememberPwd(View view) {
Intent intent = new Intent(this, RememberPwdActivity.class);
startActivity(intent);
}
}
activity_remember_pwd.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".RememberPwdActivity">
<EditText
android:id="@+id/et_username"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="100dp"
android:ems="10"
android:hint="请输入用户名"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/et_password"
android:layout_width="300dp"
android:layout_height="50dp"
android:layout_marginTop="30dp"
android:ems="10"
android:hint="请输入密码"
android:inputType="textPassword"
app:layout_constraintEnd_toEndOf="@+id/et_username"
app:layout_constraintStart_toStartOf="@+id/et_username"
app:layout_constraintTop_toBottomOf="@+id/et_username" />
<CheckBox
android:id="@+id/cb_remember"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:text="记住密码"
app:layout_constraintStart_toStartOf="@+id/et_password"
app:layout_constraintTop_toBottomOf="@+id/et_password" />
<Button
android:id="@+id/loginButton"
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_marginTop="100dp"
android:text="登录"
app:layout_constraintEnd_toEndOf="@+id/et_password"
app:layout_constraintStart_toStartOf="@+id/et_password"
app:layout_constraintTop_toBottomOf="@+id/et_password" />
</androidx.constraintlayout.widget.ConstraintLayout>
效果图:
RememberPwdActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
public class RememberPwdActivity extends AppCompatActivity {
private EditText et_username;
private EditText et_password;
private CheckBox cb_remember;
private UserDBHelper userDBHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_remember_pwd);
et_username = findViewById(R.id.et_username);
et_password = findViewById(R.id.et_password);
cb_remember = findViewById(R.id.cb_remember);
userDBHelper = new UserDBHelper(this);
//聚焦事件
et_password.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
String username = et_username.getText().toString().trim();
//查询数据库
SQLiteDatabase database = userDBHelper.getReadableDatabase();
Cursor cursor = database.query("t_user", null, "username=?", new String[]{username}, null,null,null);
User user = null;
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("username"));
String pwd = cursor.getString(cursor.getColumnIndex("password"));
user = new User(id, name, pwd);
}
if (user != null) {
//记住密码的用户,进行密码填充
et_password.setText(user.getPassword());
//勾选checkbox
cb_remember.setChecked(true);
} else {
et_password.setText("");
cb_remember.setChecked(false);
}
//关闭数据库连接
database.close();
}
}
});
//登录
findViewById(R.id.loginButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//前提是登录成功了
if (cb_remember.isChecked()) {
String username = et_username.getText().toString().trim();
//查询数据库
SQLiteDatabase database = userDBHelper.getReadableDatabase();
Cursor cursor = database.query("t_user", null, "username=?", new String[]{username}, null,null,null);
User user = null;
while(cursor.moveToNext()) {
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("username"));
String pwd = cursor.getString(cursor.getColumnIndex("password"));
user = new User(id, name, pwd);
}
//以前就存在,做更新操作
if(user != null) {
ContentValues contentValues = new ContentValues();
contentValues.put("password", et_password.getText().toString().trim());
database.update("t_user",contentValues, "username=?", new String[]{username});
} else {
//以前不存在,插入操作
ContentValues contentValues = new ContentValues();
contentValues.put("username", username);
contentValues.put("password", et_password.getText().toString().trim());
database.insert("t_user", null, contentValues);
}
database.close();
}
}
});
}
/*
* 1.输入用户名,点击输入密码->查询数据库,查看是否记住了密码,若记住,则填充密码
* 2.输入用户名,点击输入密码->查询数据库,查看是否记住了密码,若没记住,不做操作
* 3.输入用户名、密码,勾选记住密码点击登录->登录成功,向数据库中存储密码
* */
}
效果图: