[英]Room Pre populate data
我有電子郵件和密碼的編輯文本(loginfragment),我的目的是檢查數據庫中的密碼和電子郵件是否正確。
如果你點擊一個按鈕,數據庫應該讀取數據並通過密碼和電子郵件找到帳戶。
我在截屏的資產中有 dbfile。
當我點擊按鈕時崩潰,如果我在空格中有一些符號。
package Room.Database
import Room.DAO.DAO
import Room.Repository.Admindata
import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
@Database (entities = [Admindata::class], version = 2, exportSchema = true)
abstract class AdminDatabase:RoomDatabase(){
abstract fun getDAO(): DAO
companion object{
fun getadminDB(context: Context):AdminDatabase{
return Room.databaseBuilder(context.applicationContext,AdminDatabase::class.java,"admindatabase").createFromAsset("SQLDB/dbforpetproject.db").build()
}
}
}
這就是我的數據庫的樣子
道
package Room.DAO
import Room.Repository.Admindata
import androidx.room.Dao
import androidx.room.Query
@Dao
interface DAO {
@Query("select * from admin_table where email = :email")
suspend fun findbyEmail(email:String) : Admindata
@Query("select * from admin_table where password = :password")
suspend fun findbypassword(password:String) : Admindata
}
管理數據類(實體)
package Room.Repository
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity(tableName= "admin_table")
data class Admindata(
@PrimaryKey
val id:Int = 1,
@ColumnInfo(name = "email")
val email:String = "admin@gmail.com",
@ColumnInfo(name = "password")
val password:String = "12345678"
)
這就是我的片段的樣子
package com.example.myapplication
import Room.Database.AdminDatabase
import Room.Repository.Admindata
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.findNavController
import com.example.myapplication.databinding.FragmentLoginBinding
import kotlinx.coroutines.CoroutineName
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
class LoginFragment : Fragment() {
private lateinit var binding : FragmentLoginBinding
private lateinit var db:AdminDatabase
private lateinit var admin:Admindata
val scope = CoroutineScope(CoroutineName("Scope"))
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
db = AdminDatabase.getadminDB(requireContext())
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentLoginBinding.inflate(inflater)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding.continuebutton.setOnClickListener {
if(binding.EmailSpace.length() == 0){
Toast.makeText(context,"The space is empty write email",Toast.LENGTH_SHORT).show()
}
if(binding.PasswordSpace.length() == 0){
Toast.makeText(context,"The space is empty write password",Toast.LENGTH_SHORT).show()
}
if(binding.PasswordSpace.length() <8){
Toast.makeText(context,"Password is too small",Toast.LENGTH_SHORT).show()
}
if(binding.EmailSpace.length() >0){ // my wrong realization
scope.launch {
findbyEmail(email = admin.email)
}
findNavController().navigate(R.id.action_loginFragment_to_lastfragment)
}
else{
Toast.makeText(context,"Email is wrong",Toast.LENGTH_SHORT).show()
} // my wrong realization
if(binding.PasswordSpace.length() >0){ // my wrong realization
scope.launch {
findbyPassword(password = admin.password)
}
findNavController().navigate(R.id.action_loginFragment_to_lastfragment)
}
else{
Toast.makeText(context,"Password is wrong",Toast.LENGTH_SHORT).show() // my wrong realization
}
}
}
@Override
private suspend fun findbyEmail(email:String){
val tuple = db.getDAO().findbyEmail(email)
if(tuple.email != email){
Toast.makeText(context,"Email is wrong",Toast.LENGTH_SHORT).show()
}
}
@Override
private suspend fun findbyPassword(password:String){
val tuple = db.getDAO().findbypassword(password)
if(tuple.password != password){
Toast.makeText(context,"Password is wrong",Toast.LENGTH_SHORT).show()
}
}
}
考慮到電子郵件和密碼可用,那么您需要知道的是電子郵件和密碼組合是否正確(存在)。
您可以將兩個測試組合在一個查詢中,而不是運行兩個查詢,此外您可以返回一個指示符(例如和 Int)。 也許考慮以下幾點:-
@Query("SELECT count(*) FROM admin_table WHERE email=:email AND password=:password")
suspend fun findCredentialsExist(email: String,password: String):Int
然后你可以使用類似的東西
if (db.getDAO().findCredentialsExist(the_email, the_password) > 0) ....
count()
是一個聚合函數,它將返回每個 GROUP 提取的行數。 由於查詢中沒有 GROUP BY 子句,所有提取的行都是 GROUP。 因此,如果沒有行與傳遞的電子郵件和密碼匹配,則計數將為 0。如果有一行或多行匹配,則計數將為 1 或更大。
如果從查詢中返回單個值,那么 Room 允許將該值直接檢索到 Room 理解的核心對象之一(Int、Byte、Long、String、Double ....),而不是檢索到用戶定義的對象其中輸出列名稱必須是用戶定義對象所期望的名稱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.