如何验证我的房间数据库中是否存在用户名和密码?

How to verify if a username and password exists in my room database?

我正在练习房间数据库,我很难验证我的数据库中是否存在用户名和密码,(我确信我有很多错误,因此我请求你的帮助)我的代码:

//用户

  @Entity(tableName = "user_table")
    data class User(
            @PrimaryKey(autoGenerate = true)
            val id : Int ,
            val userName: String,
            val nameStudent: String,
            val grade: String,
            val password: String
    )

//UserDao v @Dao 接口 UserDao {

        @Insert(onConflict = OnConflictStrategy.IGNORE)
        suspend fun addUser(user: User)
    
 @Query("SELECT * FROM user_table WHERE userName LIKE :name AND password LIKE :password")
        fun readAllData(name: String, password: String): User
        
    }

//用户资源库

   class UserRepository(private val userDao: UserDao,val name:String, val passWord:String) {
    
    val readAllData: List<User> = userDao.readAllData(name, passWord)
    
    suspend fun adduser(user: User) {
        userDao.addUser(user)
    }

}

//用户视图模型

 class UserViewModel(application: Application,  name:String, passWord:String) : AndroidViewModel(application) {
    
    val readAllData: List<User>
    private val repository: UserRepository

    init {
        val userDao = UserDatabase.getDatabase(
            application
        ).userDao()
        repository = UserRepository(userDao,name,passWord)
        readAllData = repository.readAllData
    }

    fun addUser(user: User) {
        viewModelScope.launch(Dispatchers.IO) {
            repository.adduser(user)
        }
    }

}

//视图模型工厂

class MyViewModelFactory(private var application: Application, private var name: String, private var passWord: String) :
    ViewModelProvider.Factory {
    override fun <T : ViewModel?> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
            return UserViewModel(application, name, passWord) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

//主片段

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        super.onViewCreated(view, savedInstanceState)
        binding = FragmentMainBinding.bind(view)

        val factory = MyViewModelFactory(Application(),"","")
        mUserViewModel = ViewModelProvider(this,factory).get(UserViewModel::class.java)

        val name = binding.textInputUser.editText?.text.toString()
        val passWord = binding.textInputPassword.editText?.text.toString()

        val x = context?.let { UserDatabase.getDatabase(it).userDao() }

        val y = x?.readAllData(name,passWord)

        binding.buttonIngresar.setOnClickListener {

            if (y != null) {
                findNavController().navigate(R.id.action_mainFragment_to_candidatesFragment)

            } else {
                Toast.makeText(context, "User does not exist", Toast.LENGTH_SHORT).show()
            }

        }

    }

首先,而不是 returning User 从 Dao 中的 readAllData 方法 return List<User> 因为房间的 @Query 方法 returns 数据列表。

@Query("SELECT * FROM user_table WHERE userName LIKE :name AND password LIKE:password")
fun readAllData(name: String, password: String): List<User>

然后在用户存储库中将 readAllData 变量更改为

val readAllData: List<User> = userDao.readAllData(name:String, password:String)

在用户视图模型中 将变量 readAllData 的类型更改为 List<User>

val readAllData: List<User>

终于在MainFragment中更改方法调用

val y = x?.readAllData(name,passWord)
@Dao
interface UserDao {

    @Query("SELECT * FROM user_table WHERE userName LIKE :name AND password LIKE :password")
    fun readAllData(name: String, password: String): LiveData<User>

}

//用户存储库

class UserRepository(private val userDao: UserDao) {


    var loginDatabase: UserDatabase? = null
    var readAllData: LiveData<User>? = null

    fun initializeDB(context: Context) : UserDatabase {
        return UserDatabase.getDatabase(context)
    }

    fun getLoginDetails(context: Context, username: String,password:String) : LiveData<User>? {
        loginDatabase = initializeDB(context)
        readAllData = loginDatabase!!.userDao().readAllData(username,password)
        return readAllData
    }

}

//用户视图模型

class UserViewModel (application: Application): AndroidViewModel(application){

    var readAllData: LiveData<User>? = null
    val repository: UserRepository
    
    init {
        val userDao = UserDatabase.getDatabase(
                application
        ).userDao()
        repository = UserRepository(userDao)
        readAllData = repository.readAllData
    }
    
   
    }

    fun getLoginDetails(context: Context, username: String,password:String) : LiveData<User>? {

        readAllData = repository.getLoginDetails(context,username,password)
        return readAllData
    }

}

//主片段

  class MainFragment : Fragment() {

    private lateinit var binding: FragmentMainBinding
    private lateinit var mUserViewModel: UserViewModel

    override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        val view = inflater.inflate(R.layout.fragment_main, container, false)

        binding = FragmentMainBinding.bind(view)

        mUserViewModel = ViewModelProvider(this).get(UserViewModel::class.java)

        binding.buttonIngresar.setOnClickListener {

            val name = binding.textInputUser.editText?.text.toString()
            val passWord = binding.textInputPassword.editText?.text.toString()
            context?.let { it1 ->
                mUserViewModel.getLoginDetails(it1, name, passWord)?.observe(viewLifecycleOwner, Observer {

                    if (it == null) {
                        Toast.makeText(context, "Not found", Toast.LENGTH_SHORT).show()
                    } else {
                        Toast.makeText(context, "Found", Toast.LENGTH_SHORT).show()
                    }

                })
            }
        }

        return view

    }
    

}