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 的情况下检查用户是否存在?
我认为除了 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)
归档时间: |
|
查看次数: |
8180 次 |
最近记录: |