如何比较编辑文本与房间数据库文本

How to compare Edit Text with Room Database Text

我是 Android Studio 的新手。

我正在尝试创建一个登录页面,用户需要在其中输入电子邮件地址,数据库会将输入的电子邮件地址与数据库中的地址进行比较。

我正在使用视图模型来处理任何与数据相关的任务。我正在使用协程访问数据库,因此应用程序不会崩溃。

我的问题是,如果我使用 loginViewModel.checkEmailAddress().toString(),它只会显示为 kotlin.Unit,这不是我想要的,我想显示 user@mail.com 和那个电子邮件地址已经在数据库中了。

当用户输入正确的电子邮件地址并单击按钮后,它将转到下一个片段。到目前为止,它失败了,因为数据库总是 return as kotlin.Unit.

这是片段:

class Login : Fragment() {

    private lateinit var binding: LoginBinding

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = DataBindingUtil.inflate(
            inflater, R.layout.login, container, false
        )

        val arguments = LoginArgs.fromBundle(requireArguments())
        val application = requireNotNull(this.activity).application
        val dataSource = ArchelonDatabase.getInstance(application).userDao
        val viewModelFactory = LoginViewModelFactory(arguments.surveyKey, dataSource, application)

        val loginViewModel =
            ViewModelProvider(this, viewModelFactory).get(LoginViewModel::class.java)

        binding.loginViewModel = loginViewModel

        binding.lifecycleOwner = this

        binding.loginBtn.setOnClickListener {
            if (binding.email.text.toString() == loginViewModel.checkEmailAddress().toString()) {
                this.findNavController().navigate(
                    LoginDirections.actionLoginToMenuSelection()
                )
            } else {
                val message = "Nope"
                Toast.makeText(requireActivity(), message, Toast.LENGTH_LONG).show()
            }
        }
        return binding.root
    }
}

这是视图模型:

class LoginViewModel(
    val database: UserDao,
    application: Application
) : AndroidViewModel(application) {

    fun checkEmailAddress(
    ) {
        CoroutineScope(Dispatchers.Main.immediate).launch {
            checkEmail()
        }
    }

    private suspend fun checkEmail(): String {
        return database.getEmailAddress()
    }
}

这是 DAO:

@Dao
interface UserDao {
    // Update existing row if it's using the same ID
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(user: User)

    @Query("SELECT email_address FROM user_table LIMIT 1")
    suspend fun getEmailAddress() : String

}

你的视图模型

    private lateinit var _userEmailAdress = MutableLiveData<String>()
        val userEmailAdress : LiveData<String>
        get() = _userEmailAdress
        
        fun checkEmailAddress(
                ) {
                    CoroutineScope(Dispatchers.Main.immediate).launch {
                        val userEmail = checkEmail()
                        _userEmailAdress.value = userEmail
        
                    }
                }

你的片段

binding.loginBtn.setOnClickListener {

   loginViewModel.checkEmailAddress()
   loginViewModel.userEmailAdress.observer(viewLifecyleOwner,{
   if(it == binding.email.text.toString()){
   // your logic code
}
})

您的问题是该函数正在 returning 字符串值并尝试使用协程获取 return。我试图在移动设备上准备一个示例性概念。