Android:使用 Room 和 RxJava 检查数据库中是否存在对象

Mos*_*ius 4 android kotlin rx-java android-room

我正在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)
}
Run Code Online (Sandbox Code Playgroud)

另一方面,我在 Repository 中有一个方法可以检查用户是否登录,这是实现代码:

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

如果没有行匹配查询,Room 将抛出以下异常:

查询返回空结果集:SELECT * FROM User LIMIT 1

我想null在这种情况下返回,但是当我执行代码时,它会抛出一个异常并显示以下消息:

提供的值为空

我不能使用Optional因为 Dao 正在返回Single<User?>所以onErrorReturn应该返回相同的类型。

如何在不更改 Dao 的情况下检查用户是否存在?

lel*_*man 7

我认为除了 Android 和 Room 之外,正确的方法是COUNT在您的查询中使用。

@Query("SELECT COUNT(*) from User")
fun usersCount() : Single<Int>
Run Code Online (Sandbox Code Playgroud)

它将返回表中的行数,如果它是 0,你知道数据库中没有用户,所以。

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

如果你真的想用丑陋的方式来做:

@Query(value = "SELECT * FROM User LIMIT 1")
fun get(): Single<User>
Run Code Online (Sandbox Code Playgroud)

不要使用可空类型,它毫无意义。然后映射到 Boolean 并处理异常:

override fun isUserLogin(): Single<Boolean> = userDao
        .get()
        .async()
        .map { true }
        .onErrorReturn { false }
Run Code Online (Sandbox Code Playgroud)