我从服务器获取了List<User>
。
class User {
Long localId;
String remoteId;
..
}
我需要将每个用户从列表插入本地数据库,最后得到一个HashMap<String,Long>
(一个映射{{1 }}到remoteId
)
每个localId
返回一个insertToLocalDb
。因此,Single<Long>
发出插入的Observable
的{{1}}
我该如何以被动方式实现这一目标?
答案 0 :(得分:2)
首先,我建议使用事务处理多个数据库操作,这就是您的情况。
一个微不足道的解决方案可能看起来像这样:
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>>
,但是如果您正在使用事务处理,则第二种方法的性能要好得多。