Android Combined 2 个数据列表,一个来自 Room LiveData,1 个来自 Observable



我正在构建一个应用程序,目前有一个主要的数据模型Character,我正在使用 Room 作为本地数据库并 Retrofit2 进行 API 调用。 用户可以将字符设置为收藏夹,发生这种情况时,该字符将存储在本地数据库中(只有本地数据库知道当前用户的收藏夹字符,此应用程序不会在远程服务器上存储任何数据,只需使用 API 获取字符列表(。 问题是当用户下次加载应用程序时,如何从 web 和本地数据库(房间返回LiveData<List<Character>(加载列表,并在 RxJava2 的帮助下从存储在本地数据库中的 Web 列表Characters中过滤掉(我可以使用 Observable 作为从 retrofit2 返回(,所以当我在 RecyclerView 中显示列表时,不会有重复项。

为了更好地理解我的意思: 我有MainActivityMainViewModelMainViewModel我有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();
}

为了以一种方式处理LiveDataObservable,您可以通过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中删除重复项

最新更新