我正在构建一个应用程序,目前有一个主要的数据模型Character
,我正在使用 Room 作为本地数据库并 Retrofit2 进行 API 调用。 用户可以将字符设置为收藏夹,发生这种情况时,该字符将存储在本地数据库中(只有本地数据库知道当前用户的收藏夹字符,此应用程序不会在远程服务器上存储任何数据,只需使用 API 获取字符列表(。 问题是当用户下次加载应用程序时,如何从 web 和本地数据库(房间返回LiveData<List<Character>
(加载列表,并在 RxJava2 的帮助下从存储在本地数据库中的 Web 列表Characters
中过滤掉(我可以使用 Observable 作为从 retrofit2 返回(,所以当我在 RecyclerView 中显示列表时,不会有重复项。
为了更好地理解我的意思: 我有MainActivity
MainViewModel
,MainViewModel
我有CharacterRepository
参考,它知道如何从web加载数据作为(Call<CaharacterResponse> / Observable<CharacterResponse>
(和从本地数据库Livedata<List<Character>>
加载方法(这是被用户标记为收藏夹的字符列表(。 我想要的是当用户加载应用程序时,将加载Web和本地数据,然后过滤结果以删除重复项。 *字符响应具有有关网络呼叫结果的额外字段,其中一个字段是列表。
@Dao
public interface CharacterDao {
@Query("SELECT * FROM character ORDER BY name")
LiveData<List<Character>> getAllFavoriteCharacters();
....
}
public interface ExampleClient {
String BASE_URL = "http://gateway.example.com/public/";
@GET("characters/{id}")
Call<CharacterResponse> getCharacter(@Path("id")int id);
@GET("characters")
Call<CharacterResponse> getCharacters(@Query("limit") @Nullable Integer limit);
Observable<CharacterResponse> getCharacters();
}
为了以一种方式处理LiveData
和Observable
,您可以通过LiveDataReactiveStreams和Observable.fromPublisher()
使它们相互适应。
然后,您将有 2 个提供数据的Observables
- 一个来自 Web,另一个来自本地数据库。
- 您可以通过
Observable.concatArrayEager
合并 2 个列表,然后解决重复项,您可能需要一些解析策略,因为您需要确定哪些数据最有效,尤其是在从不同设备访问方面, -
或者您可以将本地与远程合并
local.mergeWith(remote) .collect(() -> new HashSet<Integer>(), (set, v) -> set.add(v)) .flatMap(Observable::from) .subscribe(System.out::println);
-
或者,您可以使用不同的运算符从
Observable
中删除重复项