【问题标题】:How to compare Edit Text with Room Database Text如何比较编辑文本与房间数据库文本
【发布时间】:2021-01-08 14:05:44
【问题描述】:

我是 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

}

【问题讨论】:

    标签: android android-studio viewmodel dao


    【解决方案1】:

    你的 ViewModel

        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
    }
    })
    

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

    【讨论】:

    • 谢谢。那行得通,我的下一个问题是导航。如果用户传递了错误的电子邮件地址,则会出现 toast 消息,但是当他们输入正确的电子邮件地址时,应用程序会崩溃。但是,如果用户第一次传递正确的信息,它不会崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多