【问题标题】:Android Combine 2 Lists of data one from Room LiveData and 1 from ObservableAndroid 合并 2 个数据列表,一个来自 Room LiveData,另一个来自 Observable
【发布时间】:2019-01-16 16:51:33
【问题描述】:

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

为了更好地理解我的意思: 我有MainActivityMainViewModel,在MainViewModel 我有CharacterRepository 参考,它知道如何从网络加载数据为(Call<CaharacterResponse> / Observable<CharacterResponse>)和从本地数据库加载方法Livedata<List<Character>>(这是字符列表被用户标记为收藏)。 我想要的是当用户加载应用程序时,将加载 Web 和本地数据,然后过滤结果以删除重复项。 *CharacterResponse 有关于网络调用结果的额外字段,其中一个字段是 List。

@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();
}

【问题讨论】:

  • 可以分享一下相关代码吗?
  • @Anatolii 我编辑了问题

标签: android rx-java retrofit android-room


【解决方案1】:

为了以一种方式同时处理LiveDataObservable,您可以通过LiveDataReactiveStreamsObservable.fromPublisher() 使它们相互适应。

然后您将拥有 2 个提供数据的 Observables - 一个来自网络,另一个来自本地数据库。

  • 您可以通过 Observable.concatArrayEager 合并 2 个列表,然后解析重复项,您可能需要一些解析策略,因为您需要确定哪些数据最有效,尤其是在从不同设备访问时,
  • 或者您可以将本地与远程合并

    local.mergeWith(remote) .collect(() -> new HashSet<Integer>(), (set, v) -> set.add(v)) .flatMap(Observable::from) .subscribe(System.out::println);

  • 或者您可以使用distinct 运算符从Observable 中删除重复项

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多