Kotlin 将房间数据库值与用户输入值进行比较
如何将文件室数据库中的值与文本字段进行比较?我想将用户输入值与凭证视图模型进行比较,但我不知道如何进行比较。我已经在credentialDao中设置了查询,因此获取的值应该在视图模型中。但我就是无法比较。 证书Kotlin 将房间数据库值与用户输入值进行比较,kotlin,android-room,Kotlin,Android Room,如何将文件室数据库中的值与文本字段进行比较?我想将用户输入值与凭证视图模型进行比较,但我不知道如何进行比较。我已经在credentialDao中设置了查询,因此获取的值应该在视图模型中。但我就是无法比较。 证书 @Dao interface CredentialDao { //if user name same ignore @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun addUser(creden
@Dao
interface CredentialDao {
//if user name same ignore
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addUser(credential: Credential)
@Update
suspend fun updateUser(credential: Credential)
@Query("SELECT * FROM credential_table WHERE userName LIKE :userName AND password LIKE :password")
fun readAllData(userName: String, password: String): Credential
}
凭证数据库
@Database(entities = [Credential::class], version = 1, exportSchema = false)
@TypeConverters(dateConverter::class)
abstract class CredentialDatabase: RoomDatabase() {
abstract fun credentialDao(): CredentialDao
companion object{
@Volatile
private var INSTANCE: CredentialDatabase? = null
val migration_1_2: Migration = object: Migration(2,1){
override fun migrate(database: SupportSQLiteDatabase){
}
}
fun getDatabase(context: Context): CredentialDatabase{
val tempInstance = INSTANCE
if(tempInstance != null){
return tempInstance
}
synchronized(this){
val instance = Room.databaseBuilder(
context.applicationContext,
CredentialDatabase::class.java,
"credential_database"
).fallbackToDestructiveMigration()
.build()
INSTANCE = instance
return instance
}
}
}
}
凭证存储库
class CredentialRepository(private val credentialDao: CredentialDao) {
suspend fun addCredential(credential: Credential){
credentialDao.addUser(credential)
}
suspend fun updateCredential(credential: Credential){
credentialDao.updateUser(credential)
}
fun readAllData(username: String,password:String) {
credentialDao.readAllData(username,password)
}
}
船员模型
class CredentialViewModel(application: Application): AndroidViewModel(application) {
private val repository: CredentialRepository
init{
val credentialDao = CredentialDatabase.getDatabase(application).credentialDao()
repository = CredentialRepository(credentialDao)
}
fun addCredential(credential: Credential){
viewModelScope.launch(Dispatchers.IO){
repository.addCredential(credential)
}
}
fun updateCredential(credential: Credential){
viewModelScope.launch(Dispatchers.IO){
repository.updateCredential(credential)
}
}
fun readAllData(userName: String, password: String){
viewModelScope.launch(Dispatchers.IO){
repository.readAllData(userName, password)
}
}
}
物流活动
class LoginActivity : AppCompatActivity() {
private lateinit var mUserViewModel: CredentialViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_login)
// Inflate the layout for this fragment
mUserViewModel = ViewModelProvider(this).get(CredentialViewModel::class.java)
val login = findViewById<Button>(R.id.login_btn)
login?.setOnClickListener {
val userName = username_txt.text.toString().trim();
val password = password_txt.text.toString().trim();
if(userName.isEmpty()||password.isEmpty()){
Toast.makeText(
applicationContext,
"Please fill out all field!",
Toast.LENGTH_SHORT
).show()
}else{
mUserViewModel.readAllData(userName, password)
if(user!=null){
Toast.makeText(applicationContext, "Successfully Login!", Toast.LENGTH_SHORT).show()
val intent = Intent(this@LoginActivity, MainActivity::class.java)
intent.putExtra("Username",userName)
startActivity(intent)
}else{
Toast.makeText(applicationContext, "Wrong Password!", Toast.LENGTH_SHORT).show()
}
}
}
}
}
class LoginActivity:AppCompatActivity(){
私人lateinit var mUserViewModel:CredentialViewModel
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u登录)
//为该碎片膨胀布局
mUserViewModel=ViewModelProvider(this).get(CredentialViewModel::class.java)
val login=findviewbyd(R.id.login\u btn)
登录?.setOnClickListener{
val userName=userName_txt.text.toString().trim();
val password=password_txt.text.toString().trim();
if(userName.isEmpty()| | password.isEmpty()){
Toast.makeText(
应用上下文,
“请填写所有字段!”,
吐司长度
).show()
}否则{
mUserViewModel.readAllData(用户名、密码)
如果(用户!=null){
Toast.makeText(applicationContext,“成功登录!”,Toast.LENGTH\u SHORT.show()
val intent=intent(this@LoginActivity,MainActivity::class.java)
intent.putExtra(“用户名”,用户名)
星触觉(意图)
}否则{
Toast.makeText(applicationContext,“密码错误!”,Toast.LENGTH\u SHORT.show()
}
}
}
}
}
我认为CredentialRepository
中的readAllData()
方法不正确,因为此函数需要将查询结果返回到CredentialViewModel
。正确的方法是将查询结果传递给ViewModel
尝试登录时,还应调用ViewModel
中定义的方法,并将username
和password
传递给此方法进行检索。最终结果定义了一个LiveData
,表示您是否成功登录
class CredentialViewModel(应用程序:应用程序):AndroidViewModel(应用程序){
private val mResult=MutableLiveData()
val resultLiveData:LiveData get()=mResult
专用val存储库:CredentialRepository
初始化{
val credentialDao=CredentialDatabase.getDatabase(应用程序).credentialDao()
repository=CredentialRepository(credentialDao)
}
凭证(凭证:凭证){
viewModelScope.launch(Dispatchers.IO){
repository.addCredential(凭证)
}
}
乐趣更新基准(凭证:凭证){
viewModelScope.launch(Dispatchers.IO){
repository.updateCredential(凭证)
}
}
趣味readAllData(用户名:字符串,密码:字符串){
viewModelScope.launch(Dispatchers.IO){
mResult.postValue(repository.readAllData(用户名、密码))
}
}
}
类LoginActivity:AppCompatActivity(){
私人lateinit var mUserViewModel:CredentialViewModel
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u登录)
//为该碎片膨胀布局
mUserViewModel=ViewModelProvider(this).get(CredentialViewModel::class.java)
val login=findviewbyd(R.id.login\u btn)
mUserViewModel.resultLiveData.observe(this@LoginActivity,{凭证->
如果(凭证!=null){
Toast.makeText(applicationContext,“成功登录!”,Toast.LENGTH\u SHORT.show()
val intent=intent(this@LoginActivity,MainActivity::class.java)
intent.putExtra(“用户名”,用户名)
星触觉(意图)
}否则{
Toast.makeText(applicationContext,“密码错误!”,Toast.LENGTH\u SHORT.show()
}
})
登录?.setOnClickListener{
val userName=userName_txt.text.toString().trim();
val password=password_txt.text.toString().trim();
if(userName.isEmpty()| | password.isEmpty()){
Toast.makeText(
应用上下文,
“请填写所有字段!”,
吐司长度
).show()
}否则{
mUserViewModel.readAllData(用户名、密码)
}
}
}
}
修改存储库
class CredentialRepository(private val credentialDao: CredentialDao) {
suspend fun addCredential(credential: Credential){
credentialDao.addUser(credential)
}
suspend fun updateCredential(credential: Credential){
credentialDao.updateUser(credential)
}
fun readAllData(username: String,password:String) {
credentialDao.readAllData(username,password)
}
}
class CredentialRepository(私有val credentialDao:credentialDao){
挂起凭证(凭证:凭证){
credentialDao.addUser(凭证)
}
suspend fun updateCredential(凭证:凭证){
凭证Dao.updateUser(凭证)
}
fun readAllData(用户名:字符串,密码:字符串):凭证{
返回credentialDao.readAllData(用户名、密码)
}
}
@dfw您能给我一个如何编写查询的指南吗?它会影响结果吗?全选只是选择id、用户名和密码,但我没有使用idI。对不起,我刚才犯了一个错误。事实上,您只需要LiveData就可以解决这个问题。我真的很抱歉,如果我有时间,我明天会更新我的代码。非常感谢你的帮助。我在这方面很新,我真的尝试了一整天,但每个人似乎在做登录功能时使用不同的方法