这可能是一个愚蠢的问题,但是我似乎找不到找到数据库中对象是否已经存在的方法。在这种情况下,我想检查所有用户是否已经存在,使用带哈希值的密码检查密码并返回结果。
private fun getLoginResult(username: String, password: String): Result<LiveData<BudgetyUser>> {
try{
val user = dataSource.getUser(username)
val passwordDB = user.value?.userPassword
val saltDB = user.value?.userSalt
if(user.value == null){
return Result.ErrorUserNotFound("User $username not found.")
}
if (!hashStringSha512(password, saltDB!!).contentEquals(passwordDB!!)) {
return Result.ErrorWrongPassword("Wrong password.")
}
return Result.Success(user)
} catch (e: SQLiteConstraintException){
return Result.ErrorUserNotFound("User $username not found.")
}
catch (e: Throwable) {
return Result.LoginException(IOException("Error logging in", e))
}
}
dataSource是我的DatabasDAO,它返回一个LiveData对象,但始终为null。我尝试通过提供的用户名获取用户,如果返回的对象为null,则不存在具有该名称的用户。至少那是我希望它工作的方式。任何想法如何使它那样工作吗?
预先感谢!
PS。无法找到并回答我所需要的。
interface UserDBDao {
@Insert
fun insert(user: BudgetyUser)
@Update
fun update(user: BudgetyUser)
@Query("SELECT * FROM users WHERE user_name = :username")
fun getUser(username: String) : LiveData<BudgetyUser>
@Query("DELETE FROM users")
fun deleteUsers()
}
答案 0 :(得分:2)
我们不会直接从LiveData
的值中提取数据,您应该观察它。示例:
val userLiveData = dataSource.getUser(username)
userLiveData.observe(this, Observer { user ->
// Handle user data here
}
现在,如果要查找数据库中是否存在条目,则应在DAO上使用COUNT()
。示例:
@QUERY("SELECT COUNT() FROM BudgetyUser WHERE id = :id")
fun count(id: Int): Int
然后,要确定您要查找的用户是否在数据库中,只需检查DAO的count
函数的结果是否大于0。