【发布时间】:2018-05-14 19:25:06
【问题描述】:
我有一个 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 都会刷新并且订阅者会获取新数据。
【问题讨论】:
-
使用:public Completable saveuser(用户用户)。更容易
-
从
getUsers返回的Flowable 将在表中的数据发生变化(添加、删除或修改用户)时发出一个新的List包含所有用户名 -
@LordRaydenMK 这是因为 Room 实现自己做的?如果我不使用空间并从 Iterable 手动创建 Flowable 怎么办?
-
是的,房间实现做到了。
标签: android rx-java2 android-room reactive