Прежде всего, я должен предложить использовать транзакцию для нескольких операций с БД, как в вашем случае.
Тривиальное неэффективное решение может выглядеть так:
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>>
, но второй подход гораздо более производительный, если вы используетесделка.