LiveData не вызывает Observer при добавлении новой записи в Room DB - PullRequest
2 голосов
/ 25 июня 2019

Я использую Room DB для хранения пользовательских ценовых оповещений.

Список предупреждений отображается во фрагменте с кнопкой, которая запускает новое действие для добавления новой записи.

Когда я добавляю новую запись и возвращаюсь к фрагменту, RecyclerView не отображаетсяобновлен, хотя я возвращаю LiveData и добавил Обозреватель.Я попробовал несколько ответов здесь, например, Использование MutableLiveData вместо LiveData и несколько других, но он все еще не работает.

Я попробовал несколько ответов здесь, например, Использование MutableLiveData вместо LiveData и несколько других, но это все еще нене работает.

DOA

    @Dao
    public interface PriceAlertDoa {

        public String tableName = DBContract.ALERTS_TABLE_NAME;

        @Query("SELECT * FROM " + tableName)
        public LiveData<List<PriceAlert>> getAll();

        @Query("SELECT * FROM " + tableName + " WHERE " + DBContract.ALERTS_COL_COINID + " LIKE :coinId")
        public List<PriceAlert> getByCoinId(String coinId);

        @Query("SELECT COUNT(*) FROM " + DBContract.ALERTS_TABLE_NAME)
        public int countUsers();

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        public void insertAll(PriceAlert... priceAlerts);

        @Delete
        public void deleteAll(PriceAlert... priceAlert);

        @Update
        public void updateAll(PriceAlert... priceAlert);

    }

Репозиторий

public class PriceAlertRepository {
    private PriceAlertDatabase alertsDb;
    private Context mContext;

    public PriceAlertRepository(Context context){
        mContext = context;

        if(alertsDb == null){
            alertsDb = Room.databaseBuilder(mContext.getApplicationContext(),
                    PriceAlertDatabase.class, DBContract.ALERTS_TABLE_NAME)
                    .build();
        }
    }


    public void insertAlert(PriceAlert priceAlert) {
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                alertsDb.priceAlertDoa().insertAll(priceAlert);
                return null;
            }
        }.execute();
    }

    public LiveData<List<PriceAlert>> getAllAlerts(){
        return alertsDb.priceAlertDoa().getAll();
    }

    public void deleteAlert(PriceAlert priceAlert){
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                alertsDb.priceAlertDoa().deleteAll(priceAlert);
                return null;
            }
        }.execute();
    }

    public void updateAlert(PriceAlert priceAlert){
        new AsyncTask<Void, Void, Void>(){
            @Override
            protected Void doInBackground(Void... voids) {
                alertsDb.priceAlertDoa().updateAll(priceAlert);
                return null;
            }
        }.execute();
    }
}

ViewModel

public class AlertsViewModel extends AndroidViewModel {
    private PriceAlertRepository mAlertRepository;
    private LiveData<List<PriceAlert>> mAlertList;

    public AlertsViewModel(@NonNull Application application) {
        super(application);

        mAlertRepository = new PriceAlertRepository(application);

        mAlertList = mAlertRepository.getAllAlerts();
    }

    public LiveData<List<PriceAlert>> getAllAlerts(){
        return mAlertList;
    }
}

Фрагмент, отображающий список оповещений

public class AlertsListFragment extends Fragment {
    @BindView(R.id.recyclerView_Alerts)
    RecyclerView rvAlerts;
    @BindView(R.id.button_AddAlert)
    Button btnAddAlert;

    private Context mContext;
    private AlertsViewModel alertsViewModel;

    public AlertsListFragment(Context context) {
        mContext = context;
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_alerts_list, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ButterKnife.bind(this, view);

        rvAlerts.setHasFixedSize(true);
        rvAlerts.setLayoutManager(new LinearLayoutManager(mContext));

        alertsViewModel = ViewModelProviders.of(this).get(AlertsViewModel.class);

        btnAddAlert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Utils.launchActivity(mContext, AddAlertActivity.class);
            }
        });

        AlertsListAdapter adapter = new AlertsListAdapter(mContext);
        rvAlerts.setAdapter(adapter);



        alertsViewModel.getAllAlerts().observe(getViewLifecycleOwner(), new Observer<List<PriceAlert>>() {
            @Override
            public void onChanged(List<PriceAlert> priceAlerts) {
                Log.d("LIVE DATA", "Table updated: " + priceAlerts.size());
                adapter.updateData(priceAlerts);
            }
        });
    }

}

Заранее спасибо.

...