代码之家  ›  专栏  ›  技术社区  ›  JoSem

如何使用Room和RxJava插入数据?

  •  12
  • JoSem  · 技术社区  · 7 年前
    db.activitiesDao().insertStep(step);
    

    这将返回臭名昭著的错误:

    java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
    

    我对RxJava有点陌生,不想使用AsyncTask。

    4 回复  |  直到 7 年前
        1
  •  15
  •   Mateusz Biedron    7 年前

    试试这样的。

    Observable.fromCallable(() -> db.activitiesDao().insertStep(step))
            .subscribeOn(Schedulers.io())
            .subscribe(...);
    

    或者,如果存在无效退货,您可以执行以下操作:

    Completable.fromRunnable(new Runnable(){
            db.activitiesDao().insertStep(step)
        })
        .subscribeOn(Schedulers.io())
        .subscribe(...);
    
        2
  •  3
  •   Shaon    5 年前
    fun insertIntoDb(blog: Blog) {
        Observable.fromCallable {
            Runnable {
                appDb.blogDao().insert(blog)
            }.run()
        }
                .subscribeOn(Schedulers.io())
                .subscribe {
                    D.showSnackMsg(context as Activity, R.string.book_mark_msg)
                }
    }
    

    参见上述功能。(科特林)。必须运行runnable。否则它不会保存数据。我已经用房间测试过了。快乐编码

    或使用以下代码,

    @SuppressLint("CheckResult")
    fun insertIntoDb(blog: Blog) {
        Completable.fromAction {
            appDb.blogDao().insert(blog)
        }.subscribeOn(Schedulers.io())
                .subscribe({
                    Lg.d(TAG, "Blog Db: list insertion was successful")
                }, {
                    Lg.d(TAG, "Blog Db: list insertion wasn't successful")
                    it.printStackTrace()
                })
    }
    
        3
  •  1
  •   Fahima Mokhtari    4 年前

    这对我很有用:

    insertStep(Step step); 就像他跟着你一样 activitiesDao() :

    @Insert
    void insertStep(Step step);
    

    就这样吧 addStep(Step step); 在您希望插入步骤的位置:

     public void  addStep(Step step){
        Observable<Step> observable;
        observable = io.reactivex.Observable.just( step);
        observable.subscribeOn( Schedulers.io() )
                .subscribe( new Observer<Step>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
    
                    }
    
                    @Override
                    public void onNext(@NonNull Step step) {
                        //Insert here
                        db.activitiesDao().insertStep(step);
    
                    }
    
                    @Override
                    public void onError(@NonNull Throwable e) {
                           Log.e("Error", "Error at" + e);
                    }
    
                    @Override
                    public void onComplete() {
    
                    }
                } );
    }
    

    PS:我正在使用rxjava2

        4
  •  0
  •   BAIJU SHARMA    4 年前
     fun insertContactUsData(
                contactUsData: ContactUsData,
                database: AppDatabase?,
                apiName: String
            ) {
                Observable.fromCallable {
                    database?.contactUsDao()?.insertContactUs(contactUsData)
                }
                    .subscribeOn(Schedulers.computation())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe {
                          Lg.d(TAG, list inserted successfully")
                    }
            }
    

    在表中插入数据不需要Runnable