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
    评论
Kotlin使用Room数据库是一种常见的做法,Room是Google官方提供的一个SQLite对象映射库,用于简化与SQLite数据库的交互。以下是使用Room数据库的几个步骤: 1. 添加依赖:在项目的`build.gradle`文件中添加以下依赖: ```kotlin implementation "androidx.room:room-runtime:2.4.0" kapt "androidx.room:room-compiler:2.4.0" ``` 2. 创建实体类:创建一个Kotlin类来表示数据库中的表,并使用`@Entity`注解标记它。例如,如果我们要创建一个名为`User`的表,可以这样写: ```kotlin @Entity(tableName = "users") data class User( @PrimaryKey val id: Int, val name: String, val age: Int ) ``` 3. 创建DAO接口:创建一个Kotlin接口来定义访问数据库的操作,并使用`@Dao`注解标记它。例如,如果我们要创建一个名为`UserDao`的接口,可以这样写: ```kotlin @Dao interface UserDao { @Query("SELECT * FROM users") fun getAll(): List<User> @Insert fun insertAll(vararg users: User) @Delete fun delete(user: User) } ``` 4. 创建数据库:创建一个继承自`RoomDatabase`的抽象类,并在其中定义数据库的实例和DAO接口的访问方法。例如,如果我们要创建一个名为`AppDatabase`的数据库类,可以这样写: ```kotlin @Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao } ``` 5. 初始化数据库:在应用程序的入口处(通常是`Application`类的`onCreate()`方法),使用`Room.databaseBuilder`方法来创建数据库的实例。例如: ```kotlin val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "database-name" ).build() ``` 6. 使用数据库:通过调用DAO接口中定义的方法,可以进行数据库的增删改查操作。例如: ```kotlin val userDao = db.userDao() val allUsers = userDao.getAll() userDao.insertAll(User(1, "John Doe", 25)) val user = userDao.getAll().first() userDao.delete(user) ``` 这些是使用KotlinRoom数据库的基本步骤,希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Imagine8877

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

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

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

打赏作者

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

抵扣说明:

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

余额充值