【问题标题】:It is not possible to add the response from the API to the database无法将 API 的响应添加到数据库
【发布时间】:2020-01-14 11:58:28
【问题描述】:

我有一个来自 API 的单一 GET 请求。使用RetrofitRxJava,我得到了回复。现在我想将我的回复添加到Room 数据库。但我不想使用AsyncTask 我想使用RxJava。我在Dao insertAll中准备了一个方法。如何使用RxJava 将我的列表异步添加到数据库中? 我的获取请求:

@GET("contacts")
fun getContactModel(): Single<List<Contact>>

我的道insertAll方法:

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertAll(contact: List<Contact>?) : Completable

我使用 RxJava 的请求:

val disposable = CompositeDisposable()

disposable.add(contactsRepository.modelSingle()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(object : DisposableSingleObserver<List<Contact>>() {
            override fun onSuccess(t: List<Contact>) {
                // t - My List from Api
            }

            override fun onError(e: Throwable) {
            }
        })
)

【问题讨论】:

  • 是的,当您从 web api 接收数据时,您可以保留公共 POJO 类并触发插入查询
  • 您可以使用map操作符,然后将所有数据插入db中
  • 我不知道该怎么做。网上没有例子

标签: android kotlin rx-java2 android-room


【解决方案1】:

如果contactsRepository.modelSingle() 返回一个Single Observable,那么你可以这样做

disposable.add(contactsRepository.modelSingle()
                   .doOnSuccess { data -> saveToDb(data) } // this will be called on Schedulers.io
                   .subscribeOn(Schedulers.io())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribeWith(object : DisposableSingleObserver<List<Contact>>() {
                       override fun onSuccess(t: List<Contact>) {
                           // t - My List from Api
                       }

                       override fun onError(e: Throwable) {
                       }
                   })
        )

如果是另一个 Observable,那么你可以使用 flatMap

disposable.add(contactsRepository.modelSingle()
                   .flatMap { data ->
                       saveToDb(data)
                       Observable.just(data)
                   }
                   .subscribeOn(Schedulers.io())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribe()
        )

【讨论】:

  • 我需要以某种方式将其保存到 Room 数据库
  • 只需创建一个有趣的saveToDb(data) 并使用上述过程将其插入房间数据库
  • 还有什么好玩的?我的日期是变量 t 。我不能在 .subscribeWith (object: DisposableSingleObserver>() { override fun onSuccess (t: list) { // t-my list from the Api } 之前添加它
【解决方案2】:

在 java 中,这是我首先将 Retrofit 与 RxJava 一起使用,并能够从 API 检索 Observable 响应,如下所示

在改造接口服务中使用以下代码

    @GET("contacts")
    Observable<Contacts> getContactsFromAPI

在@Dao Room Class 中实现

 @Insert(onConflict = OnConflictStrategy.REPLACE)
 Completable insertContact(List<Contact> contact);

要从 API 中检索可观察的数据项,请使用以下代码

    RetrofitService getContactService = RetroInstance.getService();
    Observable<Contact> apiData = 
     getContactService.getContactsFromAPI();

     compositeDisposable.add(apiData
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
               .subscribeWith(new DisposableObserver<Contact>() {
                @Override
                public void onNext(List<Contact> contact) {
                    newContact(contact)
                    Log.d(LOG_TAG, "The contacts are : "+ contact);
                }

                @Override
                public void onError(Throwable e) {
                    Log.d(LOG_TAG, "Error: "+ e.getMessage());
                }

                @Override
                public void onComplete() {                
                }
            }));

要将来自 api 的添加检索添加到 Room 数据库,然后创建一个调用的方法,该方法用于将数据插入到 Room 数据库中,并且在编写用于从 api 检索数据的代码上调用此方法

 public void newContact(List<Contacts> contacts) {

 disposable.add(Completable.fromAction(new Action() {
        @Override
        public void run() throws Exception {
        rowIdInserted = 
    contactAppDatabase.userDao().insertContact(contacts);
        }
    }).subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeWith(new DisposableCompletableObserver() {
            @Override
            public void onComplete() {
                Log.d(TAG, "inserted successful");
            }

            @Override
            public void onError(Throwable e) {
            Log.d(LOG_TAG, "tHE new error on create the new user is: " + 
        e.getMessage());
            }
        }));
     }

我认为这有帮助

【讨论】:

  • onSuccess 不是覆盖乐趣。此代码必须在 RxJava 代码中执行
猜你喜欢
  • 2019-10-04
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-09
  • 1970-01-01
相关资源
最近更新 更多