如何使用RxJava从房间获取数据

时间:2019-07-19 09:49:52

标签: android rx-java2

我正在使用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获取数据。任何帮助将不胜感激。

谢谢

2 个答案:

答案 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的类的属性,并在组件结束了他的生活。