【问题标题】:compare room database valuw with user input将房间数据库值与用户输入进行比较
【发布时间】:2021-05-26 11:44:44
【问题描述】:

如何将房间数据库中的值与文本字段进行比较?我想将用户输入值与凭据视图模型进行比较,但我不知道该怎么做。我已经在 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()
                }
            }

        }

    }

}

【问题讨论】:

    标签: kotlin android-room


    【解决方案1】:

    我觉得你CredentialRepository里面的readAllData()方法不对,因为这个函数需要把查询结果返回给CredentialViewModel。您正确的做法是将查询结果传递给ViewModel

    尝试登录时,还应调用ViewModel中定义的方法,并将usernamepassword传递给该方法进行检索。最终结果定义了一个LiveData&lt;Boolean&gt;,表示是否登录成功。

    
    class CredentialViewModel(application: Application): AndroidViewModel(application) {
    
        private val mResult = MutableLiveData<Credential>()
    
        val resultLiveData: LiveData<Credential> get() = mResult
    
        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){
                mResult.postValue(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)
            mUserViewModel.resultLiveData.observe(this@LoginActivity, { credential ->
                if(credential!=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()
                }
            })
    
            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)
                }
    
            }
        }
    
    
    }
    
    

    修改存储库

    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) :Credential{
            return credentialDao.readAllData(username,password)
        }
    }
    
    

    【讨论】:

    • @dfw 你能给我一个关于如何编写查询的指南吗?
    • 会影响结果吗?
    • 全选只是选择id、用户名和密码,只是我没有使用id
    • 对不起,我刚才搞错了。其实你只需要 LiveData 就可以解决这个问题。真的很抱歉,如果我有时间,我明天会更新我的代码。
    • 非常感谢您的帮助。我对此很陌生,我真的尝试了一整天,但每个人在执行登录功能时似乎使用不同的方法
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多