Как мне получить документ в firebase firestore android, чтобы он соответствовал моим конкретным учетным данным - PullRequest
1 голос
/ 20 февраля 2020

У меня есть база данных этой структуры ниже

Структура моей базы данных Firestore

У нее есть два пользователя, а именно администратор церкви и обычный пользователь церкви

Для Церковный администратор это код для регистрации новой церкви

public void onBoardChurchDetails(String church_name, String church_addr, String church_email, String church_leadName, String churchPhone, String church_icon, String churchDescr, String church_regStat, final String uid) {
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        rhemaCollRef = rChurchFireStore.collection("rhema_churches");
        rhemaHiveChurchSubClass = getRhemaHiveChurchSubClass();

        if (rhemaHiveChurchSubClass.checkChurchEmptyParams(church_icon, church_name, church_addr, churchPhone, church_email, church_leadName, churchDescr, church_regStat,uid) == 1) {

            rhemaHiveChurchModelClass = getChurchModelClass(church_name, church_addr, church_email, church_leadName, churchPhone, church_icon, churchDescr, church_regStat,uid);

            rhemaCollRef.document(church_name).set(rhemaHiveChurchModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    if (task.isSuccessful()) {
                        try {
                            getAuto().getToast(c, " Congratulations you Just Registered a new Church", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                            intent  = new Intent(c, RhemaHiveChurchPortal.class);
                            bundle.putString("church_id", uid);

                            intent.putExtras(bundle);
                            startActivity(intent);
                            clearChurchDetails();
                        }
                        catch(NullPointerException np){
                            getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        }
                    } else {
                        getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        startActivity(getAuto().newActivityStarter(c, RhemaHiveChurchPortal.class));
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                }
            });


        } else {

            getAuto().getToast(c, "Oops Seems we are missing out some data here", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

        }

    } else {
        getAuto().getToast(c, "Oops Seems No Internet Service is connected", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }
}

Для регистрации пользователя у меня есть

 public void onBoardUserWithoutSocial(String fName, String lName, String gender, String userType, String dob, String regStat, String imgPath, String userEmail, String phone , String about, final String churchName, String branchName, String addr, String city, String country, String postalCode, final String uid) {
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        fstore = getFstore();
    fiReference = fstore.collection("rhema_churches");
    rhemaHiveUserSubClass = getRhemaHiveUserSubClass();

        if (rhemaHiveUserSubClass.checkEmptyParam(fName, lName, branchName, churchName, addr, country, city, dob, gender, postalCode, regStat, phone,  userType,imgPath,userEmail,about,uid) == 1) {
            rhemaHiveUserModelClass = getUserModelClass(fName,lName,gender,userType,dob,regStat, imgPath,userEmail,phone,about,churchName,branchName,addr,city,country,postalCode,uid);
            fiReference.document(churchName).collection("members_data").document(getFullName(fName,lName)).set(rhemaHiveUserModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        try{
                        getAuto().getToast(c, "Congratulation You've onboarded sucessfully..",RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                            bundle.putString("user_id", uid);
                            bundle.putString("user_church",churchName);

                            intent.putExtras(bundle);
                        startActivity(intent);
                        clearUserDetails();
                        }
                        catch(NullPointerException np){
                            getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        }

                    }
                    else{
                        getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                }
            });

        } else {
            getAuto().getToast(c, "Oops ! !..Seems we are missing out some of your details", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
        }
    }
    else{
        getAuto().getToast(c, "Oops ! !..Seems you need to put on your data", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }
}

При успешной регистрации я хочу обычного пользователя чтобы иметь возможность войти в систему после аутентификации с использованием любого из провайдеров, таких как Facebook, Twitter или Google, его портал должен восстановить свой персонализированный портал, используя комбинацию uuid и номера телефона

, для получения профиля Церкви см. код ниже

public void retreiveChurchDetails(String id) throws NullPointerException{
    if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
    FirebaseFirestore fS = getFStore();
    rhemaCollRef = fS.collection("rhema_churches");
    rhemaCollRef.whereEqualTo("church_uid", id ).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for(DocumentSnapshot documentSnapshot  : queryDocumentSnapshots.getDocuments()){
                    church_name = documentSnapshot.getString("church_name");
                    church_email = documentSnapshot.getString("church_email");
                    church_phone = documentSnapshot.getString("church_phone");
                    church_pix_link = documentSnapshot.getString("church_pix");
                    getTextView(R.id.church_retr_name).setText(church_name);
                    getTextView(R.id.church_retr_email).setText(church_email);
                    getTextView(R.id.church_retr_phone).setText(church_phone);
                    ld_wt_gl(c,church_pix_link,44,44,getImg(R.id.church_retr_logg));

                }
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
        }
    });
    }

    else{
        getAuto().getToast(c, "Oops ! !..Seems we need an internet connection for this", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }
}

Мой вопрос заключается в том, как мне получить информацию о пользователе, прекрасно зная, что для получения пользовательских данных необходимо следовать структуре

rhema_churches => church_name (необходимо определить, как получить this) => document => members_data => user_data

Пожалуйста, обратитесь к структуре базы данных, прикрепленной выше

Пожалуйста, помогите me ..

Посмотрите, что я попробовал в любом случае

 public void retrUserDet(final String uid, String church_name) throws NullPointerException{
    if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        FirebaseFirestore fS = getFStore();
        rhemaCollRef = fS.collection("rhema_churches");
        rhemaCollRef.document(church_name).collection("members_data").whereEqualTo("user_uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                if(!queryDocumentSnapshots.getDocuments().isEmpty()){
                    for(DocumentSnapshot doc : queryDocumentSnapshots.getDocuments()){
                        user_email = doc.getString("user_email");
                        user_name = doc.getString("user_fName") + doc.getString("user_lName");
                        user_phone = doc.getString("user_phone");
                        user_pix_link = doc.getString("user_pix");
                        getTex(R.id.user_retr_email).setText(user_email);
                        getTex(R.id.user_retr_name).setText(user_name);
                        getTex(R.id.user_retr_phone).setText(user_phone);
                        ld_wt_gl(c,user_pix_link,44,44,getImg(R.id.user_retr_logg));

                    }
                }

            }
        });

    }
}

Этот метод требует два параметра для выполнения своего запроса, а именно uid и churchName

Это метод, который я попробовал за восстановление churchName, но оно не работает

  public String retrChurchName(String uid){
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        rhemaCollRef = rChurchFireStore.collection("rhema_churches");
        //rhemaCollRef.
        rhemaCollRef.whereEqualTo("uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for(DocumentSnapshot documentSnapshot : queryDocumentSnapshots.getDocuments()
                )
                {
                    if(documentSnapshot.exists()){
                        churchName = documentSnapshot.getString("church_name");
                    }

                    else{
                        getAuto().getToast(c,"Document doesnt exist", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

                    }
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
            }
        });

        return churchName;

    }

    else{
        getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + networkInfo.getExtraInfo(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }

    return "";
}

Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2020

Итак, я смог решить свои проблемы, и мой код работает нормально. Все благодаря Алексу Мамо

Первое, что мне нужно было сделать, - это реструктурировать мой входящий код как для церкви, так и для пользователя

Для Церкви у меня есть

  public void onBoardChurchDetails(String church_name, String church_addr, String church_email, String church_leadName, String churchPhone, String church_icon, String churchDescr, String church_regStat, final String uid, String userType) {
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        rhemaCollRef = rChurchFireStore.collection("rhema_churches");
        rhemaHiveChurchSubClass = getRhemaHiveChurchSubClass();

        if (rhemaHiveChurchSubClass.checkChurchEmptyParams(church_icon, church_name, church_addr, churchPhone, church_email, church_leadName, churchDescr, church_regStat, uid, userType) == 1) {

            rhemaHiveChurchModelClass = getChurchModelClass(church_name, church_addr, church_email, church_leadName, churchPhone, church_icon, churchDescr, church_regStat, uid, userType);

            rhemaCollRef.document(uid).set(rhemaHiveChurchModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {

                    if (task.isSuccessful()) {
                        try {
                            getAuto().getToast(c, " Congratulations you Just Registered a new Church", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

                            bundle.putString("church_id", uid);

                            intent.putExtras(bundle);
                            startActivity(intent);
                            //clearChurchDetails();
                        } catch (NullPointerException np) {
                            getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        }
                    } else {
                        getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        startActivity(getAuto().newActivityStarter(c, RhemaHiveChurchPortal.class));
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                }
            });


        } else {

            getAuto().getToast(c, "Oops Seems we are missing out some data here", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

        }

    } else {
        getAuto().getToast(c, "Oops Seems No Internet Service is connected", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }
}

Для регистрации пользователя у меня есть

public void onBoardUserWithoutSocial(String fName, String lName, String gender, String userType, String dob, String regStat, String imgPath, String userEmail, String phone , String about, final String churchName, String branchName, String addr, String city, String country, String postalCode, final String uid) {
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        fstore = getFstore();
    fiReference = fstore.collection("rhema_churches");
    rhemaHiveUserSubClass = getRhemaHiveUserSubClass();

        if (rhemaHiveUserSubClass.checkEmptyParam(fName, lName, branchName, churchName, addr, country, city, dob, gender, postalCode, regStat, phone,  userType,imgPath,userEmail,about,uid) == 1) {
            rhemaHiveUserModelClass = getUserModelClass(fName,lName,gender,userType,dob,regStat, imgPath,userEmail,phone,about,churchName,branchName,addr,city,country,postalCode,uid);
            fiReference.document(uid).set(rhemaHiveUserModelClass).addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        try{
                        getAuto().getToast(c, "Congratulation You've onboarded sucessfully..",RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                            bundle.putString("user_id", uid);
                            bundle.putString("user_church",churchName);

                            intent.putExtras(bundle);
                        startActivity(intent);
                        clearUserDetails();
                        }
                        catch(NullPointerException np){
                            getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + np.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                        }

                    }
                    else{
                        getAuto().getToast(c,RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + task.getException().getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();

                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(),RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
                }
            });

        } else {
            getAuto().getToast(c, "Oops ! !..Seems we are missing out some of your details", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
        }

    }




    else{
        getAuto().getToast(c, "Oops ! !..Seems you need to put on your data", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }
}

Так что вместо того, чтобы иметь коллекцию внутри другой коллекции ... Я просто имел одну коллекцию как rhema_churches, а затем имел идентификатор для каждого типа пользователя ..

См. структуру ниже

Новая структура БД

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

Так новый запрос для пользователя и церкви теперь выглядит как

Для церковного запроса у нас есть

 public void retreiveChurchDetails(String id) throws NullPointerException {
    if (networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        FirebaseFirestore fS = getFStore();
        rhemaCollRef = fS.collection("rhema_churches");
        rhemaCollRef.whereEqualTo("church_uid", id).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (DocumentSnapshot documentSnapshot : queryDocumentSnapshots.getDocuments()) {
                    church_name = documentSnapshot.getString("church_name");
                    church_email = documentSnapshot.getString("church_email");
                    church_phone = documentSnapshot.getString("church_phone");
                    church_pix_link = documentSnapshot.getString("church_pix");
                    getTextView(R.id.church_retr_name).setText(church_name);
                    getTextView(R.id.church_retr_email).setText(church_email);
                    getTextView(R.id.church_retr_phone).setText(church_phone);
                    ld_wt_gl(c, church_pix_link, 88, 88, getImg(R.id.church_retr_logg));

                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                getAuto().getToast(c, RhemaHiveClassReferenceConstants.ERROR_MESSAGE_GENERIC + e.getLocalizedMessage(), RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
            }
        });
    } else {
        getAuto().getToast(c, "Oops ! !..Seems we need an internet connection for this", RhemaHiveClassReferenceConstants.TOAST_SHORT_LEN).show();
    }


}

А затем для пользовательского запроса у меня есть

public void retrUserDet(final String uid) throws NullPointerException{
    if(networkInfo != null && networkInfo.isConnectedOrConnecting() && networkInfo.isConnected()) {
        FirebaseFirestore fS = getFStore();
        rhemaCollRef = fS.collection("rhema_churches");
        rhemaCollRef.whereEqualTo("user_uid",uid).get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                if(!queryDocumentSnapshots.getDocuments().isEmpty()){
                    for(DocumentSnapshot doc : queryDocumentSnapshots.getDocuments()){
                        user_email = doc.getString("user_email");
                        user_fName  = doc.getString("user_fName");
                        user_lName = doc.getString("user_lName");

                        user_phone = doc.getString("user_phone");
                        user_pix_link = doc.getString("user_pix");
                        getTex(R.id.user_retr_email).setText(user_email);
                        getTex(R.id.user_retr_name).setText(retFullName(user_fName,user_lName));
                        getTex(R.id.user_retr_phone).setText(user_phone);
                        ld_wt_gl(c,user_pix_link,120,120,getImg(R.id.user_retr_logg));

                    }
                }

            }
        });

    }
}

Ключ на вынос никогда не усложняет структуру вашей базы данных слишком рано .. для любого типа данных, которые отправляются в мой Firestore, он имеет тип пользователя, который также может помочь мне в моем фильтре

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...