问题
Is there any way to clear/delete all data stored using MVVM pattern?
My app looks like
Login Activity -> Main Activity -> fragments(each fragment: Firebase singleton +repository singleton+view model + view)
All the data is stored as livedata and when I logout and login with a different account the data is from previous one
fragment example:
PopularTagsFirebase
public class PopularTagsFirebase implements PopularTagsFirebaseDao {
private static PopularTagsFirebase instance = null;
private ArrayList<PopularTagsObject> popularTagsList = new ArrayList<>();
private MutableLiveData<List<PopularTagsObject>> result = new MutableLiveData<List<PopularTagsObject>>();
public static synchronized PopularTagsFirebase getInstance() {
if (instance == null) {
Log.d("PopularTagsMVVM", "FB Firebase getInstance: ");
instance = new PopularTagsFirebase();
instance.loadDataFromDb();
}
return instance;
}
private void loadDataFromDb() {
Log.d("PopularTagsMVVM", "FB getAllPopularTags: ");
DatabaseReference tagsDatabase = FirebaseDatabase.getInstance().getReference().child("Tags");
//real time update
tagsDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
String tag_name = snapshot.getKey();
int tag_popularity = (int) snapshot.getChildrenCount();
PopularTagsObject popular_tag = new PopularTagsObject(tag_name, tag_popularity);
popularTagsList.add(popular_tag);
result.postValue(popularTagsList);
}
@Override
public void onChildChanged(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
String tag_name = snapshot.getKey();
int tag_popularity = (int) snapshot.getChildrenCount();
PopularTagsObject popular_tag = new PopularTagsObject(tag_name, tag_popularity);
for (int i = 0; i < popularTagsList.size(); i++) {
if (popularTagsList.get(i).getTagName().equals(popular_tag.getTagName())) {
popularTagsList.remove(i);
}
}
popularTagsList.add(popular_tag);
result.postValue(popularTagsList);
}
@Override
public void onChildRemoved(@NonNull DataSnapshot snapshot) {
Log.d("PopularTagsMVVM", "FB onChildRemoved: ");
}
@Override
public void onChildMoved(@NonNull DataSnapshot snapshot, @Nullable String previousChildName) {
Log.d("PopularTagsMVVM", "FB onChildMoved: ");
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
@Override
public MutableLiveData<List<PopularTagsObject>> getAllPopularTags() {
return result;
}
PopularTagsRepository
public class PopularTagsRepository {
private static LiveData<List<PopularTagsObject>> allPopularTags;
private static PopularTagsRepository instance = null;
public static synchronized PopularTagsRepository getInstance() {
if (instance == null) {
instance = new PopularTagsRepository();
}
return instance;
}
public LiveData<List<PopularTagsObject>> getAllPopularTags() {
allPopularTags = new PopularTagsFirebase().getInstance().getAllPopularTags();
return allPopularTags;
}
}
PopularTagsFragmentViewModel
public class PopularTagsFragmentViewModel extends AndroidViewModel {
private PopularTagsRepository popularTagsRepository;
private LiveData<List<PopularTagsObject>> allPopularTags;
public PopularTagsFragmentViewModel(@NonNull Application application) {
super(application);
popularTagsRepository = new PopularTagsRepository().getInstance();
allPopularTags = popularTagsRepository.getAllPopularTags();
}
public LiveData<List<PopularTagsObject>> getAllPopularTags() {
allPopularTags = Transformations.map(allPopularTags, list -> sortCollection(list));
return allPopularTags;
}
public List<PopularTagsObject> sortCollection(List<PopularTagsObject> popularTagsList) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Collections.sort(popularTagsList, Comparator.comparing(PopularTagsObject::getTagPopularity).reversed());
} else {
Collections.sort(popularTagsList, new Comparator<PopularTagsObject>() {
public int compare(PopularTagsObject o1, PopularTagsObject o2) {
if (o1.getTagPopularity() == o2.getTagPopularity())
return 0;
return o1.getTagPopularity() < o2.getTagPopularity() ? -1 : 1;
}
});
Collections.reverse(popularTagsList);
}
return popularTagsList;
}
}
PopularTagsFragment
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
PopularTagsFragmentViewModel popularTagsFragmentViewModel = new ViewModelProvider(this).get(PopularTagsFragmentViewModel.class);
RecyclerView popularTagsRecyclerView = getView().findViewById(R.id.popularTagsRecyclerView);
ArrayList<PopularTagsObject> arrayList = new ArrayList<>();
popularTagsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
PopularTagsAdapter tagsPopularAdapter = new PopularTagsAdapter(getContext(), arrayList);
popularTagsRecyclerView.setAdapter(tagsPopularAdapter);
popularTagsFragmentViewModel.getAllPopularTags().observe(getActivity(), new Observer<List<PopularTagsObject>>() {
@Override
public void onChanged(List<PopularTagsObject> popularTagsObjects) {
arrayList.clear();
arrayList.addAll(popularTagsObjects);
tagsPopularAdapter.notifyDataSetChanged();
}
});
}
来源:https://stackoverflow.com/questions/63210752/how-to-clear-data-from-viewmodel-mvvm