【问题标题】:Using Rxjava to insert , delete from room db使用 Rxjava 插入,从房间数据库中删除
【发布时间】:2020-03-22 20:13:43
【问题描述】:

我正在做一个项目,我必须从房间数据库中插入和删除数据,所以基本上我使用的是旧方法,即为后台操作实现 Asynctask,但由于不再推荐,我决定使用 Rxjava相反,我试图实现它,但到目前为止我没有得到任何结果,这是一段代码,它显示了数据的插入

        Completable.fromAction(new Action() {
            @SuppressLint("CheckResult")
            @Override
            public void run() throws Exception {
                recordingDb.insertRecording(modelUidd);
            }
        }).subscribeOn(Schedulers.io());

    }

这是删除方法

 public void DeleteData(modelUidd modelUidd) {
        Completable.fromAction(new Action() {
            @Override
            public void run() throws Exception {
                recordingDb.delete(modelUidd);
            }
        }).subscribeOn(Schedulers.io());
    }

所以基本上我尝试将 Completable 与操作员 fromaction 一起使用,我不确定我实现的内容是否正确,任何帮助将不胜感激,谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    问题在于您实际上 没有订阅 observables,所以什么都没有发生。

    要订阅 observable,您必须调用 .subscribe() 方法。

    我建议您在 DAO 类(或“存储库”类)中定义的方法,例如您的示例中的 DeleteData,返回 Observable。然后,您可以调用 DAO 中的方法来获取 Observable 并从(理想情况下)从 ViewModel 订阅它,或者,如果没有,直接从 Activity 订阅它。在您调用subscribe 的那一刻,您将触发实际的插入或删除,并会从onSuccessonError 定义的回调中获得响应。

    例如:

    public class MyViewModel extends ViewModel {
    
        private MyRepository myRepository;
        private final CompositeDisposable disposables;
    
        @Inject
        public MyViewModel(MyRepository myRepository) {
            ...
            this.myRepository = myRepository;
            disposables = new CompositeDisposable();
            ...
        }
    
        public void callObservableInRepository() {
             disposables.add(myRepository.myObservable()
                                  .subscribe(onSuccess -> {...} , onError -> {...}));
        }
    
        @Override
        protected void onCleared() {
            disposables.clear();
        }
    
    }
    

    您还可以查看这两个其他答案以获取更多信息:

    About async operations in RxJava

    Using CompositeDisposable in ViewModel

    【讨论】:

    • 所以我应该使用 observable 而不是 completable 对吗? @inject 注释指的是什么(Dagger 依赖注入)?谢谢
    • 所以我现在最初所做的,我在我的存储库中有插入方法,我让它返回可完成对象,在我的视图模型中,我订阅了可完成对象,是正确的伙伴吗?
    • @takieddine 当我说“Observable”时,我指的是任何基类(Completable、Single、Maybe、Observable 和 Flowable)。我会使用 Completable 进行删除,因为它是一个不返回任何内容的任务,并且可能 Single 用于插入,因为您可能想要返回插入实体的 ID
    • @Inject 注解来自 Dagger2 依赖注入,没错。如果您正在处理一个更大的项目,我强烈建议您花时间学习和使用它。如果需要,您可以忽略它,只需使用 new 在 ViewModel 中创建存储库的实例。您说的其余部分是正确的:存储库返回 RxJava 基类(无论您决定使用什么)并且 ViewModel 订阅。您可能还应该在某个时候从您的 ViewModel 中的可观察对象中“取消订阅”(或“处置”)。我在onCleared() 上退订了所有这些
    • 它成功了伙计,非常感谢,所以基本上我必须返回一个可完成的对象,就像在这种情况下一样,然后我订阅了视图模型和我的片段,我直接从视图模型,它的工作,非常感谢你
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    相关资源
    最近更新 更多