如何使用Android Room进行单行查询

25

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

我可以像下面这样:

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

我该如何使用这个调用?看起来有一些onError / onSuccess,但是在Single<>上找不到这些方法。

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

任何工作示例都将是很棒的!

2个回答

21
根据文档,看起来我可以返回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发送到主线程。

换句话说,您可以像使用RxJava中的任何其他Single一样使用它。详细信息将根据您的需求而变化。


谢谢!在上面的例子中,User不是一个可观察对象,那么.subscribe()就不能起作用了,对吧? - rysv
1
@srvy:在第一个引用段落之后的示例中,返回值是User,你需要在后台线程上进行findByUserId()调用。在第二个引用段落之后的示例中,我正在使用你的Single<User>版本的findByUserId(),如果你在后台线程上进行subscribe(),它会为你处理后台线程。 - CommonsWare
你可以使用Maybe并使用switchIfEmpty。 - jknair0

0
根据Google文档:对于单个结果查询,返回类型可以是任何数据对象(也称为POJO)。对于返回多个值的查询,您可以使用java.util.List或Array。 Google文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接