我正在使用MVVM架构模式创建应用程序。我正在使用RxJava包装器从房间数据库而不是LiveData中获取数据。我已经设置了我的
DAO类和所有必要的方法来执行操作。我想知道如何使用存储库中的Flowable或Watable运算符获取数据。
下面是我的代码:
用户DAO。Java语言
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
用户epository.java
public class UserRepository {
private UserDb userDb;
private UserDao userDao;
private Flowable<List<User>> allUsers;
private Context ctx;
public UserRepository(Application application) {
userDb = UserDb.getInstance(application);
userDao = userDb.userDao();
allUsers = userDao.getAllUsers();
ctx = application.getApplicationContext();
}
public void insert(final User user){
Completable.fromAction(() -> userDb.userDao().insert(user))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
Toast.makeText(ctx,"Data inserted", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
Toast.makeText(ctx,e.getMessage(),Toast.LENGTH_SHORT).show();
}
});
}
}
MainActivityViewModel.java
public class MainActivityViewModel extends AndroidViewModel {
private UserRepository repos;
public MainActivityViewModel(@NonNull Application application) {
super(application);
repos = new UserRepository(application);
}
}
有人请告诉我如何使用RxJava获取数据。任何帮助都将不胜感激。
谢啦
首先,可以使用rxjava2房间适配器在构建中添加这一行。格拉德尔:
implementation 'androidx.room:room-rxjava2:2.2.0-alpha01'
其次,我建议您使用rxjava2 adapter for room并编辑dao用于:
@Dao
public interface UserDao {
@Insert
Completable insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
好的,您可以直接从dao获得completable,并为您的存储库结构传播这个completable。
对于自动获取,此可流动对象会观察您的房间db的变化,如果您插入用户,此可流动对象会发出此查询结果的新列表。第一次订阅可流动对象时,这会发出此查询的用户列表,对于每个插入的用户,可流动对象都会发出新的用户列表。
好的,为了使用此flowable,您可以通过存储库结构传播此flowable,并在ViewModel中订阅,如下所示:
repository.getFlowableAllUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userList -> { /* do anything with the fetched user list */ });
我强烈建议您使用CompositeDisposable来处理订阅当ViewModel的组件所有者处理执行时,您可以创建一个class属性来保存这个CompositeDisposable,并在组件结束生命时完成它。
你得用
下面是
//RX Room
implementation 'android.arch.persistence.room:runtime:1.1.1';
implementation 'android.arch.persistence.room:rxjava2:1.1.1'
annotationProcessor 'android.arch.persistence.room:compiler:1.1.1';
DatabaseClient.getInstance(view.getViewActivity())
.getAppDatabase()
.courseDao()
.getCourseWhoHaveMaxDate(cr_id)
.subscribeOn(Schedulers.newThread())
.observeOn(Schedulers.newThread())
.subscribe(new Consumer<CourseTable>() {
@Override
public void accept(CourseTable maxCourse) {
}
});
我可以使用RxJava添加一行,如下所示, 道: DB操作后如何获取行id?
我正在尝试获取消息的地图,作者id键如下: 这是我尝试过的: MessageViewModel.getAll()方法返回: 然后我将其转换为一个可流动的流(Flowable::fromIterable),这样它可以一次发出一个项目,而不是整个列表,然后我使用“toMultiMap”进行映射 on成功方法从不被调用,我不知道这里出了什么问题。如果我不使用toMultiMap(并对代码进行相应的修改)
我正在尝试使用RxJava在后台线程上使用我的RoomDatabase。 我的DAO类: 我的实体类(为简洁起见省略了getter和setter方法): 最后,这里是我的MeasurementDatabase类: 在我的片段中,我试图在单击菜单项后插入背景线程: 最终测量数据库appDb= 我收到一个错误,说: 我的RxJava代码中缺少了什么,没有将进程放在后台线程上?
我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo
我正在为我的数据库管理使用空间,而我在处理实时数据时,对使用什么感到困惑。目前,为了管理实时数据,我使用了,我对此非常满意。我感到困惑的是,我也可以使用来执行相同的操作。
当我尝试使用Angularjs$http.get()访问wiki api时,出现了CORS问题。这是我的密码 $http.get('http://en.wikipedia.org/w/api.php?action=query 这是错误信息 无法加载XMLHttpRequesthttps://en.wikipedia.org/w/api.php?action=query