【发布时间】: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