我取一个 List<User>
从服务器。
class User {
Long localId;
String remoteId;
..
}
我需要将列表中的每个用户插入本地数据库,最后得到一个HashMap<String,Long>
。 (将 remoteId
映射到 localId
的对象)
每个insertToLocalDb
返回 Single<Long>
.因此,Observable
发出插入的 User
的 localId
我怎样才能以一种被动的方式实现这一点?
最佳答案
首先,我必须建议对多个数据库操作使用一个事务,这就是你的情况。
一个简单的非性能解决方案可能如下所示:
fetchUsers()
.flatMap { users ->
Observable.fromIterable(users)
.flatMapSingle { user -> dao.save(user) }
.toList()
.map { databaseIds ->
val remoteIds = users.map { it.remoteId }
databaseIds.zip(remoteIds).toMap()
}
但考虑到交易,Room
例如支持这个,它可以像这样:
fetchUsers().flatMap { users ->
dao.saveAll(users) // typically returns Single<List<Long>>
.map { databaseIds ->
val remoteIds = users.map { it.remoteId }
databaseIds.zip(remoteIds).toMap()
}
}
两者都会导致 Single<Map<String, Long>>
,但如果您使用的是事务,则第二种方法的性能要高得多。
关于android - RxJava2 - 将多个 Singles 发出的结果组合成一个 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53729459/