如何比较编辑文本与房间数据库文本
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。我试图在移动设备上准备一个示例性概念。
我是 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。我试图在移动设备上准备一个示例性概念。