我有一个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都会刷新,订阅者会获得新数据。
答案 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的代码。