Kotlin使用Room来实现一个注册登录功能

目录

前言

一、有关配置信息(参考官方文档)

二、设计Entity

三、设计UserDao接口(来实现操纵数据库的语法)

四、Database的设计(单例模式)

五、登录页面的设计

 1.登录页面布局

六、注册页面设计

1.注册页面布局

 七、运行结果:


前言

一个app,注册登录功能是比较基本的服务,一般会使用阿里云来保存后台登录数据,这里为了巩固Room的学习,继续使用该模式来设计,实现简单的登录注册功能。

思路:就是没有账号先注册账号,注册完成后会跳转到登录页面进行登录,凡是错误的登录信息都会报错,登录完成将跳转到主页面。


提示:以下是本篇文章正文内容,下面案例可供参考

一、有关配置信息(参考官方文档)

plugins {
    id 'kotlin-kapt'
}
dependencies {
implementation "androidx.room:room-runtime:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"}

二、设计Entity

package com.example.kotlinlogin.Entity

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")//表的名字
data class User(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0,
    val username: String,
    val password: String
)

三、设计UserDao接口(来实现操纵数据库的语法)

package com.example.kotlinlogin

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import com.example.kotlinlogin.Entity.User

@Dao
interface UserDao {
    @Insert//插入数据操作
    suspend fun insert(user: User)
    //查询有无一样的密码,有则返回false.无则返回true
    @Query("SELECT * FROM users WHERE username = :username AND password = :password")
    suspend fun login(username: String, password: String): User?
  
    @Query("SELECT * FROM users WHERE username = :username")
    suspend fun getUserByUsername(username: String): User?

}

四、Database的设计(单例模式)

@Database(entities = [Note::class], version = 1, exportSchema = false)
//这个注解用于声明数据库的信息,如实体类信息,版本信息
//AppDatabase类被声明为抽象类的主要原因是为了定义数据库的结构,而不提供数据库的具体实现
abstract class AppDatabase : RoomDatabase() {
    abstract fun noteDao() : NoteDao //提供NoteDao的抽象方法

    companion object {//companion object中的成员在类的级别上是静态的,且只访问一次
        private var instance: AppDatabase ?= null //等会用来接收创建实例的
        fun getInstance(context: Context) : AppDatabase {
            return instance ?: synchronized(this){
                //是空就创建数据库(单例模式)
                Room.databaseBuilder(context, AppDatabase::class.java, "db_feng")
                    .build().also { instance = it }// 使用 also 函数将构建的数据实
                                                   // 赋值给 instance变量,并返实例
            }
        }
    }
}

五、登录页面的设计


class loginMainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_login_main)
        var btnLogin : Button = findViewById(R.id.loginButton)
        var etLoginUsername: EditText = findViewById(R.id.usernameEditText)
        var etLoginPassword: EditText = findViewById(R.id.passwordEditText)
        var tvRegister : Button = findViewById(R.id.registerButton)

        var userDao = AppDatabase.getInstance(this).userDao()

        btnLogin.setOnClickListener {
            val username = etLoginUsername.text.toString()//进行封装成数据对象
            val password = etLoginPassword.text.toString()

            GlobalScope.launch(Dispatchers.IO) {
                val user = userDao.login(username, password)//验证是否匹配
                if (user != null) {
                    // 登录成功
                    runOnUiThread {
                        Toast.makeText(applicationContext, "登录成功", Toast.LENGTH_SHORT).show()
                        // 在这里跳转到你的主界面
                        startActivity(Intent(this@loginMainActivity, MainActivity::class.java))
                        finish()
                    }
                } else {
                    runOnUiThread {
                        Toast.makeText(applicationContext, "登录失败,请检查用户名和密码", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }

        tvRegister.setOnClickListener {
            Log.d("feng", "失败了")//用于注册跳转
            startActivity(Intent(this@loginMainActivity, RegisterMainActivity::class.java))
        }
    }
}
 1.登录页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

  <EditText
      android:id="@+id/usernameEditText"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="Username"
      android:minHeight="48dp" />

  <EditText
      android:id="@+id/passwordEditText"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:hint="Password"
      android:inputType="textPassword"
      android:minHeight="48dp" />

  <Button
      android:id="@+id/loginButton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Login" />

  <Button
      android:id="@+id/registerButton"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Register" />

</LinearLayout>

六、注册页面设计

class RegisterMainActivity : AppCompatActivity() {
    private lateinit var userDao: UserDao
    private lateinit var btnRegisterConfirmButton: Button
    private lateinit var etRegisterUsername: EditText
    private lateinit var etRegisterPassword: EditText
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_register_main)

        // 初始化按钮和输入框
        btnRegisterConfirmButton = findViewById(R.id.registerConfirmButton)
        etRegisterUsername = findViewById(R.id.registerUsernameEditText)
        etRegisterPassword = findViewById(R.id.registerPasswordEditText)

        userDao = AppDatabase.getInstance(this).userDao()

        btnRegisterConfirmButton.setOnClickListener {
            val username = etRegisterUsername.text.toString()
            val password = etRegisterPassword.text.toString()

            if (username.isNotEmpty() && password.isNotEmpty()) {
                GlobalScope.launch(Dispatchers.IO) {
                    val existingUser = userDao.getUserByUsername(username)
                    if (existingUser == null) {
                        // 用户不存在,可以注册
                        val user = User(username = username, password = password)
                        userDao.insert(user)
                        runOnUiThread {
                            Toast.makeText(this@RegisterMainActivity, "注册成功", Toast.LENGTH_SHORT).show()
                            // 在这里跳转到登录界面
                            startActivity(Intent(this@RegisterMainActivity, loginMainActivity::class.java))
                            finish()
                        }
                    } else {
                        // 用户已存在
                        runOnUiThread {
                            Toast.makeText(this@RegisterMainActivity, "该用户名已被注册,请使用其他用户名", Toast.LENGTH_SHORT).show()
                        }
                    }
                }
            } else {
                Toast.makeText(this@RegisterMainActivity, "请输入用户名和密码", Toast.LENGTH_SHORT).show()
            }
        }
    }
}
1.注册页面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <EditText
        android:id="@+id/registerUsernameEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Username"
        android:minHeight="48dp" />

    <EditText
        android:id="@+id/registerPasswordEditText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Password"
        android:inputType="textPassword"
        android:minHeight="48dp" />

    <Button
        android:id="@+id/registerConfirmButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Register" />
</LinearLayout>

 七、运行结果:

  • 16
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Imagine8877

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

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

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

打赏作者

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

抵扣说明:

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

余额充值