Извлечение данных из FireStore с использованием архитектуры MVVM - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь следовать принципам архитектуры 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...