Я пытаюсь следовать принципам архитектуры Android и хотел бы, чтобы вы реализовали их поверх моей базы данных FireStore.
В настоящее время у меня есть репозиторий Class
, который обрабатывает все мои запросы с соответствующими данными.У меня есть Fragment
, который требует Set<String>
ключей от полей в документе, и мне интересно, каков наилучший подход для получения этих данных.В моем предыдущем вопросе Алекс Мамо предложил использовать Interface
в сочетании с onCompleteListener
, поскольку получение данных из Firestore - Asynchronous
.
Этот подход, кажется, работает, но я не уверен, как извлечь данные из этого Interface
в переменную, локальную для моего Fragment
.Если я хочу использовать эти данные, мой код должен соответствовать моему определению abstract
метода?
Я все еще придерживаюсь принципа MVVM, если для передачи данных из Firestore в мой Fragment
я долженпередать объект Interface
, определенный во фрагменте, как параметр в мой репозиторий?
Является ли это рекомендуемым подходом для запроса базы данных Firestore с использованием репозитория?
Ниже приведены мои Interface
иметод, который вызывает ViewModel
для извлечения данных:
public interface FirestoreCallBack{
void onCallBack(Set<String> keySet);
}
public void testMethod(){
Log.i(TAG,"Inside testMethod.");
mData.getGroups(new FirestoreCallBack() {
//Do I have to define what I want to use the data for here (e.g. display the contents of the set in a textview)?
@Override
public void onCallBack(Set<String> keySet) {
Log.i(TAG,"Inside testMethod of our Fragment and retrieved: " + keySet);
myKeySet = keySet;
Toast.makeText(getContext(),"Retrieved from interface: "+ myKeySet,Toast.LENGTH_SHORT).show();
}
});
}
My ViewModel
метод для вызова в репозитории:
private FirebaseRepository mRepository;
public void getGroups(TestGroupGetFragment.FirestoreCallBack firestoreCallBack){
Log.i(TAG,"Inside getGroups method of FirebaseUserViewModel");
mRepository.getGroups(firestoreCallBack);
}
Наконец, мой метод репозитория в query
myБаза данных FireStore:
public void getGroups(final TestGroupGetFragment.FirestoreCallBack firestoreCallBack){
Log.i(TAG,"Attempting to retrieve a user's groups.");
userCollection.document(currentUser.getUid()).get().addOnCompleteListener(
new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()){
DocumentSnapshot document = task.getResult();
Log.i(TAG,"Success inside the onComplete method of our document .get() and retrieved: "+ document.getData().keySet());
firestoreCallBack.onCallBack(document.getData().keySet());
} else {
Log.d(TAG,"The .get() failed for document: " + currentUser.getUid(), task.getException());
}
}
});
Log.i(TAG, "Added onCompleteListener to our document.");
}
EDITED
public void testMethod(){
Log.i(TAG,"Inside testMethod.");
mData.getGroups(new FirestoreCallBack() {
@Override
public void onCallBack(Set<String> keySet) {
Log.i(TAG,"Inside testMethod of our Fragment and retrieved: " + keySet);
myKeySet = keySet;
someOtherMethod(myKeySet); //I know I can simply pass keySet.
Toast.makeText(getContext(),"GOT THESE FOR YOU: "+ myKeySet,Toast.LENGTH_SHORT).show();
}
});
Log.i(TAG,"In testMethod, retrieving the keySet returned: "+ myKeySet);
}