繁体   English   中英

RxJava2 和带循环的 Room

[英]RxJava2 and Room with loop

我有一个程序,其中数据使用 Room 存储在本地数据库中,我通过 RxJava2 接收数据。 在 Provider 中,数据库创建了一种方法,该方法采用一个参数 - 标识符,通过该方法它发送请求并接收与标识符相对应的某些数据。 但我想作为参数传递的不是一个标识符,而是一个标识符数组并获得一个数组,但我不知道如何。 我不想通过for来实现它,因为我认为有更好的解决方案,但我找不到它。 我的代码如下所示。

...
userDatabase.userDao().getById(id)
                .subscribeOn(Schedulers.io())
                .observeOn(SchedulerProvider.ui())
            .map {
                InfoStruct(
                    it.Name.toString(),
                    it.Id.toString()
                )
            }
            .subscribe(
                {println("${it.userName} || ${it.userId}")},
                {println("Error")}
            )
...

我将一个值传递给 getById 方法参数 - 一个标识符,然后发送如下请求:select * where id =: id。 我想传递一个标识符数组作为参数来一次获取多个用户的数据,但我不想更改请求的结构。 如何才能做到这一点?

您可以使用一个 dao,例如 getByManyIds(),它使用 WHERE 子句,该子句根据提供的列表返回一个列表。

SELECT 子句可能类似于

@Query("SELECT * FROM the_table WHERE id IN (:idlist)"
List<your_type> getByManyIds(appropriate_type idlist);

适当的类型应该是 id 的 int[]、long[]、String[] 等适当的数组(Room 将生成适当的逗号分隔列表)。

假设您的 Dao 方法如下所示:

@Query("SELECT * FROM user WHERE id = :id"
Single<User> getById(String id);

你需要做的就是把它改成这样:

@Query("SELECT * FROM user WHERE id IN (:ids)"
Single<List<User>> getByIds(List<String> ids);

然后像这样使用它:

userDatabase.userDao().getByIds(listOfIds)
        .subscribeOn(Schedulers.io())
        .observeOn(SchedulerProvider.ui())
        .map { users ->
            users.map {
                InfoStruct(
                    it.Name.toString(),
                    it.Id.toString()
                )
            }
        }
        ....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM