数据未正常更新(房间数据库)

问题描述 投票:1回答:2

当刷新页面向API发出请求并将数据插入我的房间数据库时,我需要。但是,当我尝试插入数据时,我得到io.reactivex.exceptions.OnErrorNotImplementedException: UNIQUE constraint failed: data.id (code 1555).所以我决定检查我的表是否为空,如果不是更新请求,但所以我的recyclerview无法正常工作,数据在db上没有正确更新。这是我的代码:

 private void getData() {
        progressBar.setVisibility(View.VISIBLE);
        APIInterface service = RetrofitInstance.getRetrofitInstance().create(APIInterface.class);
        Call<DataAll> call = service.getData();
        call.enqueue(new Callback<DataAll>() {
            @Override
            public void onResponse(Call<DataAll> call, Response<DataAll> response) {
                if(response.body() != null) {
                     List<Data> allData = response.body().getData();

                    Disposable disposable = db.dataDao().dataSize().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Integer>() {
                        @Override
                        public void accept(Integer dbSize) throws Exception {
                            if(dbSize > 0)
                                updateData(allData);
                            else
                                insertData(allData);
                            fillListFromDb();

                        }
                    });
                }
            }

            @Override
            public void onFailure(Call<DataAll> call, Throwable t) {
                tvErrorMessage.setVisibility(View.VISIBLE);
                recyclerDataList.setVisibility(View.GONE);
                progressBar.setVisibility(View.GONE);
                swipeRefreshToUpdateList.setRefreshing(false);
                Toast.makeText(getApplicationContext(), R.string.errorMessage, Toast.LENGTH_LONG).show();
                t.printStackTrace();
            }
        });
    }

    private void fillListFromDb() {
            Disposable disposable = db.dataDao().getAllData().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<List<Data>>() {
            @Override
            public void accept(List<Data> data) throws Exception {
                listData.clear();
                listData.addAll(data);
                adapter = new MyAdapter(listData);
                adapter.notifyDataSetChanged();
                recyclerDataList.setAdapter(adapter);
                progressBar.setVisibility(View.GONE);
                swipeRefreshToUpdateList.setRefreshing(false);
            }
        });
    }

    private void updateData(List<Data> data) {
        Completable.fromAction( () ->
                db.dataDao().updateData(data))
                .subscribeOn(Schedulers.io())
                .subscribe();
    }

    private void insertData(List<Data> data) {
        Completable.fromAction(() ->
            db.dataDao().addData(data)).
                subscribeOn(Schedulers.io())
                .subscribe();
    }

并且onCreate方法:

   @Override
        protected void onCreate(Bundle savedInstanceState) {
  //  ……
      swipeRefreshToUpdateList.setOnRefreshListener(() -> {
                    tvErrorMessage.setVisibility(View.GONE);
                    recyclerDataList.setVisibility(View.VISIBLE);
                    getData();
                });
    }

请帮我

android rx-java2 android-room android-database android-jetpack
2个回答
1
投票

如果你想要一个insert操作来覆盖DB中的现有对象,那么你应该使用OnConflictStrategy.REPLACE

见例子:

@Dao
interface CatDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertCats(cats: List<Cat>)

-1
投票

你必须在你的List<Data>一个接一个地检查你updateData例如:

@Override
        public void onResponse(Call<DataAll> call, Response<DataAll> response) {
            if(response.body() != null) {
                 List<Data> allData = response.body().getData();
                 for (Data data:allData){
                  if(isStored(data.getId())){
                      updateData(data);
                        else {
                        insertData(data);
                        }

                       }
                   }
                }  
            }
        }

你可以在你的qazxsw poi qazxsw poi中创建一个新方法并使用DataDao方法直接更新它

祝好运 !希望对你有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.