「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战
SQLite是一个轻量型的数据库,也是AndroidSDK中自带滴。 本篇文章演示用SQLite来实现实现登录注册模块。
登录界面
<?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>
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;
}
现在数据库已经写完了,关注我,下一篇与登录注册实战