Android操作SQLite数据库实现登录注册(一)

1,938 阅读3分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战

SQLite是一个轻量型的数据库,也是AndroidSDK中自带滴。 本篇文章演示用SQLite来实现实现登录注册模块。

bbcfea843b11b3ce94e0d392bdfac3a.jpg

登录界面

<?xml version="1.0" encoding="utf-8"?>
<layout
    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">
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/headoortrait"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            android:src="@drawable/ic_login_picture" />

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/et_username_layout"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="26dp"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintTop_toBottomOf="@+id/headoortrait"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent">

            <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="用户账号"/>
        </com.google.android.material.textfield.TextInputLayout>

        <com.google.android.material.textfield.TextInputLayout
            android:id="@+id/et_password_layout"
            style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintTop_toBottomOf="@+id/et_username_layout"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent">
            <com.google.android.material.textfield.TextInputEditText
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="textPassword"
                android:hint="密码"/>
        </com.google.android.material.textfield.TextInputLayout>

      

        <Button
            android:id="@+id/btn_login"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="登录"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintTop_toBottomOf="@+id/et_username_layout" />

        <Button
            android:id="@+id/btn_register"
            android:layout_width="match_parent"
            android:layout_height="56dp"
            android:text="注册"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layout_constraintTop_toBottomOf="@+id/btn_login" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

注册界面

<?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"
    android:clickable="true"
    android:background="@color/white">
<!--    <ImageView-->
<!--        android:layout_width="match_parent"-->
<!--        android:layout_height="match_parent"-->
<!--        android:scaleType="fitCenter"-->
<!--        app:srcCompat="@drawable/bg_register" />-->

    <com.google.android.material.textfield.TextInputLayout
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:id="@+id/user_name_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="90dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteY="160dp">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用户名" />
    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/phone_number_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:layout_marginTop="26dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/user_name_layout"
        tools:layout_editor_absoluteY="160dp">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="手机号" />
    </com.google.android.material.textfield.TextInputLayout>
    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/password_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:layout_marginTop="26dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/phone_number_layout"
        tools:layout_editor_absoluteY="160dp">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:hint="密码" />
    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/confirm_password_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
        android:layout_marginTop="26dp"
        android:layout_marginStart="16dp"
        android:layout_marginEnd="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/password_layout"
        tools:layout_editor_absoluteY="160dp">

        <com.google.android.material.textfield.TextInputEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:inputType="textPassword"
            android:hint="确认密码" />
    </com.google.android.material.textfield.TextInputLayout>

    <Button
        android:id="@+id/btn_register"
        android:layout_width="130dp"
        android:layout_height="56dp"
        android:text="注  册"
        android:layout_marginTop="26dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/confirm_password_layout" />
</androidx.constraintlayout.widget.ConstraintLayout>

335d308d2a3a52184184f72b01bf9ee.jpg

  style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"

登录数据实体类

/**
 * @Description
 * @Author 九狼
 * @Time 2022/2/20 17:53
 */
public class UserBean {

    private int id;
    /**
     * 用户名
     */
    private String name;

    /**
     * 密码
     */
    private String password;

    /**
     * 手机号
     */
    private String phoneNumber;

    /**
     * 年龄
     */
    private String age;
    /**
     * 年龄
     */
    private String sex;

    /**
     * 身份验证结果
     */
    private String authenticationResults;

    /**
     * 头像
     */
    private String avatar;

    /**
     * 身份证
     */
    private String idNumber;
}

SQLite

set和get我就不写了

DAO模型

接口封装DAO模型,这样的封装之后,只需要调用方法,就可以对数据库进行增删改查操作。

baseDao

public interface BaseDao<T> {
 void add(T entity);
 void delete(int id);
 void update(T entity);
 List<T> query();
}

SQLiteOpenHelper

SQLite的辅助类————SQLiteOpenHelper
SQLiteOpenHelper是SQLiteDatabase的一个辅助类,用来管理数据库的创建和版本的更新。通常是建立一个类继承它,接着实现它的onCreate和onUpgrade方法

构造方法,要传递一个创建的数据库名称和版本参数

/**
 * @Description
 * @Author
 * @Time 2022/2/19 18:01
 */
public class SQLiteDatabaseHelper extends SQLiteOpenHelper {

    private static final String DB_NAME="travelsafty.db";//数据库名称
    //版本号
    private static final int TRAVELSAFTY_VERSION =1;
    /**
     * UserBean
     *字段要和UserBean一一对应哦
     */
    public static final String TABLE_USER="user";
    public static final String USER_ID="id";
    public static final String USER_NAME="name";
    public static final String USER_PASS_WORD = "password";
    public static final String USER_PHONE_NUMBER = "phoneNumber";
    public static final String USER_AGE = "age";
    public static final String USER_SEX = "sex";
    public static final String USER_AUTHENTICATION_RESULTS = "authenticationResults";
    public static final String USER_AVATAR = "avatar";
    public static final String USER_ID_NUMBER = "idNumber";

//创建表
    public static final String CREATE_USER ="create table user ( id integer primary key autoincrement, name text, password text, phoneNumber text, age text, sex text, authenticationResults text, avatar text,idNumber text)";

    public SQLiteDatabaseHelper(Context context) {
        super(context,DB_NAME,null, TRAVELSAFTY_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
       //执行创建UserBean表
        db.execSQL(CREATE_USER);

    }

    /**升级数据库
     * 1、第一次创建数据库的时候,这个方法不会走
     * 2、清除数据后再次运行(相当于第一次创建)这个方法不会走
     * 3、数据库已经存在,而且版本升高的时候,这个方法才会调用
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //采用for迭代升级, 让不同用户的不同版本的数据库都可以兼容升级到最新
        for (int j = oldVersion + 1; j <= newVersion; j++) {

            upgradeTo(db, j);
        }
    }
    private void upgradeTo(SQLiteDatabase db, int version) {
        try {
            switch (version) {
                case 1:

                    break;
                case 2:
                  
                    break;
                case 3:

                    break;
                case 4:
                    break;
                default:
                    break;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

SQLite的数据类型

SQLite的五种常用的数据类型

  • NULL: 表示一个NULL值
  • INTEGER: 用来存储一个整数,根据大小可以使用1,2,3,4,6,8位来存储.
  • REAL: IEEE 浮点数
  • TEXT: 按照字符串来存储
  • BLOB: 按照二进制值存储,不做任何改变.

SQLiteDatabase

使用SQLiteDatabase完成对数据进行

  • 添加(Create)
  • 查询(Retrieve)
  • 更新(Update)
  • 删除(Delete)

简称为CRUD


/**
 * @Description
 * @Author 九狼
 * @Time 2022/2/20 18:15
 */
public class UserBeanDaoImpl implements BaseDao<UserBean> {

    SQLiteDatabaseHelper myDatabaseHelper;

    public UserBeanDaoImpl(Context context) {
        myDatabaseHelper = new SQLiteDatabaseHelper(context);
    }

    @Override
    public void add(UserBean userBean) {
        SQLiteDatabase sqLiteDatabases = myDatabaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        //开始组装数据
        values.put(SQLiteDatabaseHelper.USER_NAME, userBean.getName());
        values.put(SQLiteDatabaseHelper.USER_PASS_WORD, userBean.getPassword());
        values.put(SQLiteDatabaseHelper.USER_PHONE_NUMBER, userBean.getPhoneNumber());
        values.put(SQLiteDatabaseHelper.USER_AGE, userBean.getAge());
        values.put(SQLiteDatabaseHelper.USER_SEX, userBean.getSex());
        values.put(SQLiteDatabaseHelper.USER_NAME, userBean.getName());
        values.put(SQLiteDatabaseHelper.USER_AUTHENTICATION_RESULTS, userBean.getAuthenticationResults());
        values.put(SQLiteDatabaseHelper.USER_AVATAR, userBean.getAvatar());
        values.put(SQLiteDatabaseHelper.USER_ID_NUMBER, userBean.getIdNumber());
        //插入数据
        sqLiteDatabases.insert(SQLiteDatabaseHelper.TABLE_USER, null, values);
        values.clear();
    }

    @Override
    public void delete(int id) {
        SQLiteDatabase sqLiteDatabases=myDatabaseHelper.getWritableDatabase();
        sqLiteDatabases.delete(SQLiteDatabaseHelper.TABLE_USER, SQLiteDatabaseHelper.USER_ID + "=?",new String[]{String.valueOf(id)});

    }

    @Override
    public void update(UserBean userBean) {
        SQLiteDatabase sqLiteDatabases = myDatabaseHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        //开始组装数据
        values.put(SQLiteDatabaseHelper.USER_NAME, userBean.getName());
        values.put(SQLiteDatabaseHelper.USER_PASS_WORD, userBean.getPassword());
        values.put(SQLiteDatabaseHelper.USER_PHONE_NUMBER, userBean.getPhoneNumber());
        values.put(SQLiteDatabaseHelper.USER_AGE, userBean.getAge());
        values.put(SQLiteDatabaseHelper.USER_SEX, userBean.getSex());
        values.put(SQLiteDatabaseHelper.USER_NAME, userBean.getName());
        values.put(SQLiteDatabaseHelper.USER_AUTHENTICATION_RESULTS, userBean.getAuthenticationResults());
        values.put(SQLiteDatabaseHelper.USER_AVATAR, userBean.getAvatar());
        values.put(SQLiteDatabaseHelper.USER_ID_NUMBER, userBean.getIdNumber());

        //更新
        sqLiteDatabases.update(
                SQLiteDatabaseHelper.TABLE_USER
                ,values,
                SQLiteDatabaseHelper.USER_ID + "=?",new String[]{String.valueOf(userBean.getId())});
        values.clear();
    }

    @Override
    public List<UserBean> query() {
        List<UserBean> userData=null;
        //查询是Readable,其余是Writable
        SQLiteDatabase sqLiteDatabases=myDatabaseHelper.getReadableDatabase();
        Cursor cursor=sqLiteDatabases.query(SQLiteDatabaseHelper.TABLE_USER,null,null,null,null,null,null);
        if(cursor.moveToFirst()){
            userData=new ArrayList<>();
            while(cursor.moveToNext()){
                UserBean user=new UserBean();
                int id=cursor.getInt((int) cursor.getColumnIndex(SQLiteDatabaseHelper.USER_ID));
                String name=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_NAME));
                String password=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_PASS_WORD));
                String phoneNumber=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_PHONE_NUMBER));
                String age=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_SEX));
                String sex=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_PASS_WORD));
                String authenticationResults=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_AUTHENTICATION_RESULTS));
                String avatar=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_AVATAR));
                String idNumber=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_ID_NUMBER));

                user.setId(id);
                user.setName(name);
                user.setPassword(password);
                user.setPhoneNumber(phoneNumber);
                user.setAge(age);
                user.setSex(sex);
                user.setAuthenticationResults(authenticationResults);
                user.setAvatar(avatar);
                user.setIdNumber(idNumber);
                userData.add(user);
            }
        }
        cursor.close();
        return userData;
    }
    
}

Cursor

Cursor是结果集游标,用于对结果集进行随机访问 用游标Cursor接收从数据库检索到的数据

Cursor判空

未注册时查询要Cursor判空
不能
if(Cursor == nill)
应为curos已经实例化了
正确姿势是
if (cursor.getCount() ==0)

接着cursor.moveToFirst();

moveToFirst

moveToFirst()方法(用于将游标移动到结果集的第一行,如果结果集为空,返回值为false,否则为true )

法根据用户名来查询

public UserBean userNameQuery(String  userName) {
        SQLiteDatabase sqLiteDatabases=myDatabaseHelper.getReadableDatabase();
        Cursor cursor=sqLiteDatabases.query(SQLiteDatabaseHelper.TABLE_USER, new String[]{"id","name","password","phoneNumber","age","sex","authenticationResults","avatar","idNumber"},"name=? ",new String[]{userName},null,null,null);
        UserBean user=new UserBean();
        if (cursor.getCount() ==0){
            return null;
        }

        cursor.moveToFirst();
        int id=cursor.getInt((int) cursor.getColumnIndex(SQLiteDatabaseHelper.USER_ID));
        String name=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_NAME));
        String password=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_PASS_WORD));
        String phoneNumber=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_PHONE_NUMBER));
        String age=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_AGE));
        String sex=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_SEX));
        String authenticationResults=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_AUTHENTICATION_RESULTS));
        String avatar=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_AVATAR));
        String idNumber=cursor.getString((int)cursor.getColumnIndex(SQLiteDatabaseHelper.USER_ID_NUMBER));
        user.setId(id);
        user.setName(name);
        user.setPassword(password);
        user.setPhoneNumber(phoneNumber);
        user.setAge(age);
        user.setSex(sex);
        user.setAuthenticationResults(authenticationResults);
        user.setAvatar(avatar);
        user.setIdNumber(idNumber);

        return user;
    }

现在数据库已经写完了,关注我,下一篇与登录注册实战