使用 RxJava 将列表插入房间数据库

Insert a List Into Room Database Using RxJava

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

房间

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

第一种保存数据的方法:

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 数据库中?

我想这就是@Mwasz 的意思:

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

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