我正在使用MVVM体系结构模式创建应用程序。正在使用RxJava包装器从会议室数据库而不是LiveData中获取数据。我已经设置了我的
DAO类和执行操作的所有必要方法。我想知道如何使用存储库中的Flowable或Observable运算符获取数据。
下面是我的代码:
UserDao.java
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
UserRepository.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获取数据。任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
您必须使用
位于下方
//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) {
}
});
答案 1 :(得分:0)
首先,您可以使用rxjava2房间适配器在build.gradle上添加以下行:
implementation 'androidx.room:room-rxjava2:2.2.0-alpha01'
第二,我建议您使用rxjava2适配器腾出空间并编辑dao:
@Dao
public interface UserDao {
@Insert
Completable insert(User user);
@Query("SELECT * FROM Users ORDER BY id DESC")
Flowable<List<User>> getAllUsers();
}
好吧,您可以直接从dao获取可完成的内容,并将其传播给您的存储库结构。
对于自动获取,此flowable观察您的房间数据库的变化,如果您插入用户,则此flowable会发出新列表,该列表是此查询的结果。第一次订阅flowable时,它会发出此查询的用户列表,并且对于插入的每个用户,flowable都会发出新的用户列表。
好吧,要使用此可流动对象,您可以在存储库结构中传播该可流动对象,并在ViewModel中进行订阅,如下所示:
repository.getFlowableAllUsers()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(userList -> { /* do anything with the fetched user list */ });
我强烈建议您在ViewModel的组件所有者处置执行时使用CompositeDisposable
处置您的订阅,您可以创建一个保存该CompositeDisposable
的类的属性,并在组件结束了他的生活。