【问题标题】:Insert a List Into Room Database Using RxJava使用 RxJava 将列表插入房间数据库
【发布时间】:2020-06-08 09:19:33
【问题描述】:

我有一个要映射的项目列表,然后插入到房间表中:

房间

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(vararg projectLocal: ProjectLocal): Completable

保存数据的FIRST方法:

Observable.fromIterable(remoteProjects)
            .map { project ->
                ...
                mProjectMapper.mapRemoteToLocal(project)
            }
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe {
                mProjectRepository.saveProject(it)
            }

如你所见,我是 observing on -> main threadsubscribing on -> io

第二种保存数据的方法:

remoteProjects.forEach { remote ->
                ...
                val project = mProjectMapper.mapRemoteToLocal(remote)
                mProjectRepository.saveProject(project)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe()
            }

哪一个更有意义?有没有更好的方法来使用 RxJava 将所有这些数据保存在 Room 数据库中?

【问题讨论】:

  • 我认为第一种方法更好,因为你只调用了一次 saveProject(),而在第二种方法中你最终会调用 saveProject() n 次。此外,如果您在将项目添加到数据库后不需要在 UI 上执行任何操作,则无需在主线程上观察它,因此您可以删除 .observeOn() 行.
  • @Mwasz 感谢您分享您的意见它给了我一个想法。第一个仍然多次调用saveProject 函数,除非我使用Observable.just() 而不是Observable.fromIterable
  • 哦,是的,你是对的。一个简单的解决方案是在映射后调用.toList() 并将saveProject() 方法更改为接受List<ProjectLocal>。这样,您将在整个列表中调用一次 saveProject()
  • @Mwasz 用你的逻辑发布一个答案,我很乐意接受。

标签: android kotlin android-room rx-java2


【解决方案1】:

我认为这就是@Mwasz 的意思:

Observable.fromIterable(remoteProjects)
        .map { project ->
            mProjectMapper.mapRemoteToLocal(project)
        }
        .toList()
        .flatMapCompletable {
            mProjectRepository.saveProject(it)
                .subscribeOn(Schedulers.io())
        }
        .subscribe()

您也可以使用reducecollect 代替toList,但toList() 是最简单的。

【讨论】:

  • 我明天会检查这个,如果它有效,我会接受你作为正确答案;)
猜你喜欢
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
相关资源
最近更新 更多