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

问题描述

我是 Android Studio 的新手。

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

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

我的问题是,如果我使用 loginviewmodel.checkEmailAddress().toString() 它只会将其显示kotlin.Unit 这不是我想要的,我想显示 user@mail.com 并且该电子邮件地址已经在自己的数据库中。

用户输入正确的电子邮件地址并点击按钮后,它将转到下一个片段。到目前为止,它失败了,因为数据库总是返回 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
}
})

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...