Android RxJava2将新数据插入数据库

时间:2017-11-30 18:53:23

标签: android rx-java2 android-room reactive

我有一个Android应用程序,其数据层由可通过Room访问的数据库资源表示。这是我DAO的两种方法

@Query("SELECT * FROM user")
Flowable<List<UserEntity>> getUsers();

@Insert(onConflict = OnConflictStrategy.REPLACE)
void saveUser(final UserEntity user);

我的活动onCreate方法显示用户列表,然后插入带表单的新活动。它订阅了这样的observable:

mUserViewModel.getUsers()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe (this::populateList)

简化了视图模型的实现

public Flowable<List<User>> getUsers(){
    return repository.getUsers();
}

现在我想知道当我成功地将新用户插入数据库以刷新用户列表时,通知我的observable的最佳方法是什么?

使用BehaviorProcessor<any value>是否正确,每次成功插入新用户并在其中观察BehaviorProcessor和可观察的内容(如switchMap方法)时都会发出一个值?

这是一个带过滤器的例子:

BehaviorProcessor<String> mFilter = BehaviorProcessor.createDefault(DEFAULT_VALUE);

public Flowable<List<User>> getUsers(){
    return repository.getUsers()
        .switchMap(users -> mFilter.map(this::filterList));
}

public void saveUser(User user){
    repository.saveUser(user);
    filter.emit(DEFAULT_VALUE);
}

这样每次我发出一个新值时,observable都会刷新,订阅者会获得新数据。

1 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,当桌子改变时,Room已经负责发出一个项目。

要解决问题的其他部分,请参阅反应购物车的示例代码。 (项目而不是用户)

/**
 * Holds a list of items that has been added to the shopping cart
 *
 * @author Hannes Dorfmann
 */
public class ShoppingCart {
  private BehaviorSubject<List<Product>> itemsInShoppingCart =
      BehaviorSubject.createDefault(Collections.emptyList());

  /**
   * An observable to observe the items in the shopping cart
   */
  public Observable<List<Product>> itemsInShoppingCart() {
    return itemsInShoppingCart;
  }

  /**
   * Adds a product to the shopping cart
   */
  public Completable addProduct(Product product) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.add(product);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }

  /**
   * Remove a product to the shopping cart
   */
  public Completable removeProduct(Product product) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.remove(product);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }

  /**
   * Remove a list of Products from the shopping cart
   */
  public Completable removeProducts(List<Product> products) {
    List<Product> updatedShoppingCart = new ArrayList<>();
    updatedShoppingCart.addAll(itemsInShoppingCart.getValue());
    updatedShoppingCart.removeAll(products);
    itemsInShoppingCart.onNext(updatedShoppingCart);
    return Completable.complete();
  }
}

来自here的代码。