【问题标题】:How to do a single row query with Android Room如何使用 Android Room 进行单行查询
【发布时间】:2018-04-13 22:14:34
【问题描述】:

如何使用带有 RxJava 的 Android Room 进行单行查询?我可以查询项目列表,没有问题。在这里,我想查找是否存在特定行。根据文档,如果不存在行,我可以返回 Single 并检查 EmptyResultSetException 异常。

我可以有类似的东西:

@Query("SELECT * FROM Users WHERE userId = :id LIMIT 1")
Single<User> findByUserId(String userId);

如何使用此调用?看起来有一些 onError / onSuccess 但在 Single 上找不到这些方法。

usersDao.findByUserId("xxx").???

任何可行的例子都会很棒!

【问题讨论】:

    标签: android rx-java2 android-room


    【解决方案1】:

    根据文档,如果不存在行,我可以返回 Single 并检查 EmptyResultSetException 异常。

    或者,如果您正在通过其他方式处理后台线程,则只需返回 User

    @Query("SELECT * FROM Users WHERE userId = :id")
    User findByUserId(String id);
    

    如何使用这个调用?

    usersDao.findByUserId("xxx")
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribe(user -> { ... }, error -> { ... });
    

    在这里,我展示了 subscribe() 采用两个 lambda 表达式,用于 User 和错误。您可以改用两个 Consumer 对象。我还假设您有 rxandroid 作为 AndroidSchedulers.mainThread() 的依赖项,并且您希望在该线程上将 User 传递给您。

    IOW,您使用它的方式与使用 RxJava 中的任何其他 Single 相同。详细信息将根据您的需要而有所不同。

    【讨论】:

    • 谢谢!在上面的例子中,用户不是可观察的权利吗?那么 .subscribe() 将无法正常工作?
    • @srvy:在第一个引用段落之后的示例中,返回值为User,您需要在后台线程上调用findByUserId()。在第二个引用段落之后的示例中,我使用您的findByUserId()Single&lt;User&gt; 版本,如果您在后台线程上subscribe(),它会为您处理后台线程。
    • 或者你可以使用 Maybe 并使用 switchIfEmpty
    猜你喜欢
    • 1970-01-01
    • 2021-12-04
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多