当前位置: 首页 > 知识库问答 >
问题:

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

巫马瀚漠
2023-03-14

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

谢啦

共有2个答案

涂羽
2023-03-14

首先,可以使用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,并在组件结束生命时完成它。

谷梁波
2023-03-14

你得用

下面是

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