Kotlin 将房间数据库值与用户输入值进行比较

Kotlin 将房间数据库值与用户输入值进行比较,kotlin,android-room,Kotlin,Android Room,如何将文件室数据库中的值与文本字段进行比较?我想将用户输入值与凭证视图模型进行比较,但我不知道如何进行比较。我已经在credentialDao中设置了查询,因此获取的值应该在视图模型中。但我就是无法比较。 证书 @Dao interface CredentialDao { //if user name same ignore @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun addUser(creden

如何将文件室数据库中的值与文本字段进行比较?我想将用户输入值与凭证视图模型进行比较,但我不知道如何进行比较。我已经在credentialDao中设置了查询,因此获取的值应该在视图模型中。但我就是无法比较。 证书

@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就可以解决这个问题。我真的很抱歉,如果我有时间,我明天会更新我的代码。非常感谢你的帮助。我在这方面很新,我真的尝试了一整天,但每个人似乎在做登录功能时使用不同的方法