【问题标题】:How to fetch data from room using RxJava如何使用 RxJava 从房间中获取数据
【发布时间】:2019-07-19 23:13:38
【问题描述】:

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

谢谢

【问题讨论】:

  • 如何使用这个方法select qureys

标签: android rx-java2


【解决方案1】:

你必须使用

以下取决于

    //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) {

                }
            });

【讨论】:

  • 我有以上所有依赖,但是我应该在我的存储库文件中添加什么以便获取数据。
【解决方案2】:

首先,您可以使用 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 获取 Completable 并为你的存储库结构传播这个 Completable。

对于自动获取,这个flowable会观察你房间数据库的变化,如果你插入一个用户,这个flowable会发出这个查询结果的新列表。当您第一次订阅 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 并在组件结束生命时完成它.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多