Android: проверьте, присутствует ли объект в базе данных, используя Room и RxJava - PullRequest
0 голосов
/ 08 сентября 2018

Я использую Room в качестве ORM, и вот мой интерфейс Dao:

@Dao
interface UserDao {
    @Query(value = "SELECT * FROM User LIMIT 1")
    fun get(): Single<User?>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun add(profile: User)
}

С другой стороны, у меня есть метод в репозитории, который должен проверять, является ли пользователь логином или нет, вот код реализации:

override fun isUserLogin(): Single<Boolean> = userDao
            .get().async()
            .onErrorReturn { null }
            .map { it != null }

Комната выдаст следующее исключение, если ни одна строка не соответствует запросу:

Запрос вернул пустой набор результатов: SELECT * FROM User LIMIT 1

Я хочу вернуть null в этом случае, но когда я выполняю код, выдается исключение со следующим сообщением:

Указано нулевое значение

Я не могу использовать Optional, потому что Дао возвращает Single<User?>, поэтому onErrorReturn должен вернуть тот же тип.

Как я могу проверить, существует ли пользователь или нет, не меняя Дао?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Если вы измените свой DAO, чтобы он возвращал Текущий список пользователей, вы можете затем сопоставить его с логическим значением, проверив размер списка.

@Query(value = "SELECT * FROM User LIMIT 1")
fun get(): Flowable<List<User>> 

, например

fun isUserLogin(): Single<Boolean> = userDao
    .get()
    .flatMapSingle { Single.just(it.size == 1) }
    .onErrorReturn { false }
    .first(false)
0 голосов
/ 08 сентября 2018

Я думаю, что правильным способом сделать это, кроме Android и Room, является использование COUNT в вашем запросе.

@Query("SELECT COUNT(*) from User")
fun usersCount() : Single<Int>

Будет возвращено количество строк в таблице, если оно равно 0, вы знаете, что в БД нет пользователя, поэтому.

override fun isUserLogin(): Single<Int> = userDao
            .usersCount()
            .async()
            .map { it > 0 }

Если вы действительно хотите сделать это ужасно, хотя:

@Query(value = "SELECT * FROM User LIMIT 1")
fun get(): Single<User>

Не используйте обнуляемый тип, это бессмысленно. Затем сопоставьте с логическим значением и обработайте исключение:

override fun isUserLogin(): Single<Boolean> = userDao
        .get()
        .async()
        .map { true }
        .onErrorReturn { false }
0 голосов
/ 08 сентября 2018

Используйте Maybe, который точно моделирует ответ, ожидающий 0 результатов, 1 результат или исключение.

...