【问题标题】:RxJava2 and Room with loopRxJava2 和带循环的 Room
【发布时间】:2021-05-06 16:25:44
【问题描述】:

我有一个程序,其中数据使用 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。我想传递一个标识符数组作为参数来一次获取多个用户的数据,但我不想更改请求的结构。如何做到这一点?

【问题讨论】:

    标签: android kotlin android-room rx-java2


    【解决方案1】:

    您可以使用 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 将生成适当的逗号分隔列表)。

    【讨论】:

    • 如果我把订阅放在里面会不会很粗鲁,循环遍历数组的每个元素?
    【解决方案2】:

    假设您的 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()
                    )
                }
            }
            ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 1970-01-01
      相关资源
      最近更新 更多