Данные не обновляются нормально (база данных комнаты) - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно при обновлении страницы сделать запрос к API и вставить получение данных в мою базу данных комнаты.Но когда я пытаюсь вставить данные, я получаю io.reactivex.exceptions.OnErrorNotImplementedException: UNIQUE constraint failed: data.id (code 1555). Так что я решил проверить, пуста ли моя таблица, и если нет, сделать запрос на обновление, но мой просмотрщик не работает нормально, и данные не обновляются должным образом на БД.Вот мой код:

 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();
                });
    }

Пожалуйста, помогите мне

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Если вы хотите, чтобы операция insert перезаписывала существующий объект в БД, вам следует использовать OnConflictStrategy.REPLACE.

См. Пример:

@Dao
interface CatDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertCats(cats: List<Cat>)
0 голосов
/ 15 февраля 2019

Вы должны проверить вас 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);
                        }

                       }
                   }
                }  
            }
        }

вы можете создать новый метод в вашем DataDao findDataById(string id) и использовать его boolean isStored(String id) метод и обновите его напрямую

Удачи!надеюсь, что это поможет вам.

...