目录
前言
一个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>