Проверьте, существует ли объект в комнате - PullRequest
1 голос
/ 22 марта 2020

это может быть глупый вопрос, но я не могу найти способ узнать, существует ли объект в моей базе данных или нет. В этом случае я хочу проверить, существует ли уже пользователь со всем, проверить пароль с хешированным и вернуть результат.

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))
    }
}

Источник данных - это мой DatabasDAO, который возвращает объект LiveData, но всегда значение 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()



}

1 Ответ

2 голосов
/ 22 марта 2020

Мы не извлекаем данные из LiveData прямо из его значения, вы должны их соблюдать. Пример:

val userLiveData = dataSource.getUser(username)
userLiveData.observe(this, Observer { user ->
    // Handle user data here
}

Теперь, если вы хотите узнать, присутствует ли запись в вашей базе данных, вы должны использовать COUNT() в вашей DAO. Пример:

@QUERY("SELECT COUNT() FROM BudgetyUser WHERE id = :id")
fun count(id: Int): Int

Затем, чтобы узнать, находится ли искомый пользователь в вашей базе данных, просто проверьте, больше ли результат вашей функции DAO count, чем 0.

...