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;

    @Override
    protected 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);
    }

    @Override
    protected void onStart() {
        super.onStart();
        //获得数据库帮助器实例
        loginDBHelper = LoginDBHelper.getInstance(this);
        loginDBHelper.openWriteLink();//打开数据库
        loginDBHelper.openReadLink();
        reload();
    }

    @Override
    protected void onStop() {
        super.onStop();
    loginDBHelper.closeLink();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

    }

    @Override
    public 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);

          }

        }


    @Override
    public 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语句
    @Override
    public 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);
    }

    @Override
    public 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">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="用户名"/>
    <EditText
        android:id="@+id/et_name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="密码"/>
    <EditText
        android:id="@+id/et_pws"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"

        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        >

        <CheckBox
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="记住密码"
            android:id="@+id/cb_password"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="注册"

            android:id="@+id/btn_register"
            />
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:text="登录"

            android:id="@+id/btn_login"
            />
    </LinearLayout>
</LinearLayout>

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android Studio提供了多种数据存储方式,以下是其中的三种: 1. 使用SharedPreferences存储数据 SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如窗口状态,字体大小等。SharedPreferences存储的数据是以键值对的形式存储的,可以存储基本数据类型和String类型的数据。以下是一个使用SharedPreferences存储数据的例子: ```java // 获取SharedPreferences对象 SharedPreferences sharedPreferences = getSharedPreferences("data", MODE_PRIVATE); // 获取SharedPreferences.Editor对象 SharedPreferences.Editor editor = sharedPreferences.edit(); // 存储数据 editor.putString("name", "Tom"); editor.putInt("age", 18); // 提交数据 editor.apply(); ``` 2. 文件存储数据 Android平台上可以使用File类来进行文件操作,可以通过FileOutputStream和FileInputStream来进行文件的读写操作。以下是一个使用文件存储数据的例子: ```java // 获取文件路径 File file = new File(getFilesDir(), "data.txt"); // 写入数据 try { FileOutputStream outputStream = new FileOutputStream(file); outputStream.write("Hello World".getBytes()); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } // 读取数据 try { FileInputStream inputStream = new FileInputStream(file); byte[] bytes = new byte[inputStream.available()]; inputStream.read(bytes); String data = new String(bytes); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } ``` 3. SQLite数据库存储数据 SQLite是Android平台上的一个轻量级关系型数据库,可以用来存储结构化数据。可以使用Android提供的SQLiteOpenHelper类来创建和管理数据库。以下是一个使用SQLite存储数据的例子: ```java // 创建数据库 public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String CREATE_TABLE = "create table Book (" + "id integer primary key autoincrement, " + "author text, " + "price real, " + "pages integer, " + "name text)"; public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } // 插入数据 MyDatabaseHelper dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1); SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("name", "The Da Vinci Code"); values.put("author", "Dan Brown"); values.put("pages", 454); values.put("price", 16.96); db.insert("Book", null, values); // 查询数据 Cursor cursor = db.query("Book", null, null, null, null, null, null); if (cursor.moveToFirst()) { do { String name = cursor.getString(cursor.getColumnIndex("name")); String author = cursor.getString(cursor.getColumnIndex("author")); int pages = cursor.getInt(cursor.getColumnIndex("pages")); double price = cursor.getDouble(cursor.getColumnIndex("price")); } while (cursor.moveToNext()); } cursor.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿ฅ( ̳• ε • ̳)ฅ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值