Обновление LiveData при изменении ссылки на базу данных - PullRequest
0 голосов
/ 13 февраля 2020

Я следил за великолепным блогом @Doug Stevenson, и теперь я успешно использую LiveData и ViewModel для получения данных из базы данных Firebase и наблюдения за данными в моем фрагменте. Теперь мне нужно прочитать данные из новой ссылки в базе данных. Однако LiveData продолжает извлекать данные из исходного местоположения.

Вот мой код ViewModel:

    public class BoysViewModel extends ViewModel {
    private static final DatabaseReference BOYS_REF =
            FirebaseDatabase.getInstance().getReference().child(**GlobalVars.appUser.getCurrentId()**).child("boys");

    private final FirebaseLiveData liveData = new FirebaseLiveData(BOYS_REF);

    private final LiveData<List<Boy>> boyLiveData =
            Transformations.map(liveData, new Deserializer());

    private class Deserializer implements Function<DataSnapshot, List<Boy>> {
        @Override
        public List<Boy> apply(DataSnapshot dataSnapshot) {
            List<Boy> temp = new ArrayList<>();
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                Boy post = postSnapshot.getValue(Boy.class);
                post.setKidKey(postSnapshot.getKey());
                temp.add(post);
            }
            return temp;
        }
    }

    @NonNull
    public LiveData<List<Boy>> getBoysLiveData() {
        return boyLiveData;
    }
}

FirebaseLiveData - это класс, расширяющий LiveData

    public class FirebaseLiveData extends LiveData<DataSnapshot> {
    private static final String LOG_TAG = "FirebaseLiveData";

    private final Query query;
    private final FirebaseLiveData.MyValueEventListener listener = new FirebaseLiveData.MyValueEventListener();


    FirebaseLiveData(Query ref) {
        this.query = ref;
    }


    public FirebaseLiveData(DatabaseReference ref) {

        this.query = ref;
    }

    @Override
    protected void onActive() {
        Log.d(LOG_TAG, "onActive");
        query.addValueEventListener(listener);
    }

    @Override
    protected void onInactive() {
        Log.d(LOG_TAG, "onInactive");
        //query.removeEventListener(listener);
    }

    private class MyValueEventListener implements ValueEventListener {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            setValue(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
        }
    }

}

В моем фрагменте onResume:

 BoysViewModel model = new ViewModelProvider(requireActivity()).get(BoysViewModel.class);
    LiveData<List<Boy>> boyLiveData = model.getBoysLiveData();

    boyLiveData.observe(getViewLifecycleOwner(), new Observer<List<Boy>>() {
        @Override
        public void onChanged(List<Boy> changedBoys) {...

В другой части моего приложения я изменяю ссылку BOYS_REF (вторая строка в BoysViewMode), изменяя GlobalVars.appUser.getCurrentId (), и снова запускаю фрагмент. Фрагмент проходит через методы начального жизненного цикла и также вызывает onResume. Но LiveData по-прежнему указывает на старые данные из предыдущего пути.

Как я могу изменить свой код, чтобы получать обновления LiveData с новым путем?

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

...